models.py 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516
  1. import os
  2. import uuid
  3. import datetime
  4. import shutil
  5. from django.db.models import *
  6. from django.core.validators import MinValueValidator, MaxValueValidator
  7. from django.contrib.auth.models import User
  8. from django.core.files.storage import FileSystemStorage
  9. from django_countries.fields import CountryField
  10. from django.urls import reverse
  11. from django.db import models
  12. from django.dispatch import receiver
  13. from django.db.models.signals import post_delete, post_save
  14. from django.conf import settings
  15. from multiselectfield import MultiSelectField
  16. from imagekit.models import ImageSpecField
  17. from imagekit.processors import ResizeToFill
  18. from imagekit.processors import ResizeToCover
  19. from imagekit.processors import Thumbnail
  20. from imagekit.processors import ResizeToCover
  21. from imagekit.models import ProcessedImageField
  22. from post_office import mail
  23. from constance import config
  24. from marktplatz.widgets import *
  25. class Contact(models.Model):
  26. user = OneToOneField(User, on_delete=models.CASCADE,blank=True)
  27. first_name = CharField(verbose_name="Vorname", max_length = 100)
  28. last_name = CharField(verbose_name="Nachname", max_length = 100)
  29. adress = CharField(verbose_name="Adresse", blank=True,max_length = 100)
  30. postcode = CharField(verbose_name="Postleitzahl", blank=True, max_length = 100)
  31. city = CharField(verbose_name="Stadt", blank=True,max_length = 100)
  32. country = CharField(verbose_name="Land", blank=True,max_length = 100)
  33. email = EmailField(verbose_name="E-Mail-Addresse", unique=True)
  34. phonenumber = CharField(verbose_name="1. Telefonnummer", blank=True,max_length = 100)
  35. alternate_phonenumber = CharField(verbose_name="2. Telefonnummer", blank = True,max_length = 100)
  36. skype_name = CharField(verbose_name="Skype", blank=True,max_length = 300)
  37. website = URLField(verbose_name="Website", blank=True)
  38. def __str__(self):
  39. return self.first_name + ' ' + self.last_name
  40. def __iter__(self):
  41. for field in self._meta.fields:
  42. yield (field.verbose_name, field.value_to_string(self))
  43. class Category(models.Model):
  44. name = CharField(max_length=100)
  45. short_name = CharField(max_length=10)
  46. def __str__(self):
  47. return self.name
  48. class Product(models.Model):
  49. def __init__(self, *args, **kwargs):
  50. super(Product, self).__init__(*args, **kwargs)
  51. # def save(self, update_fields=None, *args, **kwargs):
  52. #https://stackoverflow.com/questions/1355150/when-saving-how-can-you-check-if-a-field-has-changed
  53. # super().save( update_fields=update_fields, *args, **kwargs) # Call the "real" save() method.
  54. STATUS = [
  55. ('ENT', 'Entwicklung'),
  56. ('BET', 'In Betrieb'),
  57. ('ABG', 'Abgeschlossen'),
  58. ]
  59. FREI = [
  60. ('JAJA', 'Platz frei'),
  61. ('WART', 'Nein, aber es gibt eine Warteliste'),
  62. ('NEIN', 'Nein und es gibt keine Warteliste'),
  63. ]
  64. RECHTSFORM = [
  65. ('GmbH', 'GmbH'),
  66. ('Verein', 'Verein'),
  67. ('Genossenschaft', 'Genossenschaft'),
  68. ('GbR', 'GbR'),
  69. ('Sonstiges', 'Sonstiges'),
  70. ]
  71. ORT = [
  72. ('1010', '1., Innere Stadt'),
  73. ('1020', '2., Leopoldstadt'),
  74. ('1030', '3., Landstraße'),
  75. ('1040', '4., Wieden'),
  76. ('1050', '5., Margareten'),
  77. ('1060', '6., Mariahilf'),
  78. ('1070', '7., Neubau'),
  79. ('1080', '8., Josefstadt'),
  80. ('1090', '9., Alsergrund'),
  81. ('1100', '10., Favoriten'),
  82. ('1110', '11., Simmering'),
  83. ('1120', '12., Meidling'),
  84. ('1130', '13., Hietzing'),
  85. ('1140', '14., Penzing'),
  86. ('1150', '15., Rudolfsheim-Fünfhaus'),
  87. ('1160', '16., Ottakring'),
  88. ('1170', '17., Hernals'),
  89. ('1180', '18., Währing'),
  90. ('1190', '19., Döbling'),
  91. ('1200', '20., Brigittenau'),
  92. ('1210', '21., Floridsdorf'),
  93. ('1220', '22., Donaustadt'),
  94. ('1230', '23., Liesing'),
  95. ('GERM', 'Deutschland'),
  96. ('SCHW', 'Schweiz'),
  97. ('VORA', 'Vorarlberg'),
  98. ('TIRO', 'Tirol'),
  99. ('SALZ', 'Salzburg'),
  100. ('KAER', 'Kärnten'),
  101. ('STEI', 'Steiermark'),
  102. ('OBER', 'Oberösterreich'),
  103. ('NIER', 'Niederösterreich'),
  104. ('BURG', 'Burgenland'),
  105. ('WELT', 'Welt'),
  106. ]
  107. ORGANIZATION = [
  108. ('Soziokratie', 'Soziokratie'),
  109. ('Sonstiges', 'Sonstiges'),
  110. ]
  111. @property
  112. def kind_of_product(self):
  113. return "Allgemeines Produkt"
  114. name = CharField( 'Name', max_length = 128, help_text="Name des Projekts", null = True, blank=True )
  115. claim = CharField( 'Claim / Untertitel', max_length = 256, help_text="Claim / Untertitel", null = True, blank=True )
  116. beschreibung = TextField( 'Beschreibung', max_length = 2048, help_text="Beschreibung des Projektes", null = True, blank=True )
  117. learning = CharField( 'Learning', max_length = 256, help_text="Learning", null = True, blank=True )
  118. gruendungsjahr = IntegerField('Gründungsjahr', help_text="Gründungsjahr des Projekts", validators=[MinValueValidator(0), MaxValueValidator(9999)], null = True, blank=True )
  119. betriebgenommen = IntegerField('in Betrieb genommen in Jahr', help_text="Wann wurde das Projekt in Betrieb genommen?", validators=[MinValueValidator(0), MaxValueValidator(9999)], null = True, blank=True )
  120. status = CharField( 'Status', max_length = 3, choices=STATUS, default='ENT', help_text="Was ist der Status des Projektes" , null = True, blank=True )
  121. adresse = CharField( 'Adresse', max_length = 256, help_text="Adresse des Projektes", null = True, blank=True )
  122. plz = CharField ( 'Adresse', max_length = 256, help_text="PLZ des Projektes", null = True, blank=True )
  123. adresse_zusatz = CharField ( 'Adresse Zusatz', max_length = 256, help_text="Adresse Zusatz", null = True, blank=True )
  124. ort = CharField ( 'Ort', max_length = 4, choices=ORT, default='WELT', help_text="Ort des Projektes", null = True, blank=True )
  125. website = URLField ( 'Website', max_length = 2048, help_text="Website des Projektes", null = True, blank=True )
  126. email = EmailField ( 'Email', max_length = 2048, help_text="Email des Projektes", null = True, blank=True )
  127. frei = CharField ( 'Platz frei', max_length = 4, choices=FREI, default='NEIN', help_text="Gibt es freie Plätze?", null = True, blank=False )
  128. kfrei = CharField ( 'Platz frei - Kommentar', max_length = 2048, help_text="Kommentar", null = True, blank=True )
  129. rechtsform = CharField ( 'Rechtsform', max_length = 32, help_text="Rechtsform des Projektes", null = True, blank=True )
  130. orga = CharField ( 'Organisationsform', max_length = 256, help_text="Organisationsform des Projektes.", null = True, blank=True )
  131. mitmachen = BooleanField( 'Mitmachen möglich', default=False, help_text="Kann jemand mitmachen?", blank=False )
  132. terms = NullBooleanField(help_text="")
  133. edit = BooleanField( default=True, help_text="", blank=False )
  134. public = BooleanField( default=False, help_text="", blank=False )
  135. title = CharField('Product Title',max_length = 100,null = True, blank=True)
  136. country = CountryField(blank=True,multiple=True, help_text="")
  137. city = CharField(max_length = 100,null = True, blank=True, help_text="")
  138. year = IntegerField('Year of Completion',null = True, blank=True, help_text="")
  139. owner = CharField(max_length = 300,null = True,blank=True, help_text="")
  140. teaser_txt = TextField(blank = True, max_length = 1050, help_text="")
  141. header = CharField(max_length = 900 , help_text="",null = True, blank=True)
  142. description_txt = TextField(max_length = 3000 ,null = True, blank=True, help_text="")
  143. #cid = IntegerField(null = True,blank=True, help_text="")
  144. class_cid = CharField(null = True,max_length = 3, blank=True, help_text="")
  145. sumbitted = CharField(null = True,max_length = 10, blank=True, help_text="")
  146. date_submitted = DateField(auto_now_add=True, help_text="")
  147. photo = CharField(max_length=500, null=True, blank=True, help_text="")
  148. videocts = CharField(max_length=500, null=True, blank=True, help_text="")
  149. category = ManyToManyField(Category, help_text="",null = True, blank=True)
  150. # credits = ForeignKey(Credit, null = True, blank=True, on_delete=models.SET_NULL, help_text="")
  151. contact = ForeignKey(Contact, null = True,on_delete=models.SET_NULL, help_text="")
  152. #interaction = ForeignKey(Interaction, null = True,on_delete = models.SET_NULL, help_text="")
  153. def __str__(self):
  154. return str(self.name)
  155. def __iter__(self):
  156. for field in self._meta.fields:
  157. yield (field.verbose_name, field.value_to_string(self))
  158. def get_field_verbose_name(self, fieldName):
  159. return self._meta.get_field(fieldName).verbose_name
  160. def meta(self):
  161. return self._meta
  162. @receiver(post_delete, sender=Product)
  163. def auto_delete_reverse_keys(sender, instance, **kwargs):
  164. if instance.credits:
  165. instance.credits.delete()
  166. if instance.description:
  167. instance.description.delete()
  168. if instance.interaction:
  169. instance.interaction.delete()
  170. class SearchAgent(models.Model):
  171. def hash_gen():
  172. return uuid.uuid1().hex
  173. email = EmailField ( 'Email', max_length = 2048, help_text="Email des Projektes", null = False, blank=False )
  174. ort = MultiSelectField ( 'Ort', max_length = 4096 , choices=Product.ORT, default='WELT', help_text="Ort des Projektes", null = True, blank=False )
  175. hash = CharField ( max_length=255, default=hash_gen )
  176. class Wohnprojekt(Product):
  177. EIGENTUM = [
  178. ('GEMIET', 'Generalmiete'),
  179. ('WOHNHM', 'Wohnheim'),
  180. ('EIGENT', 'Eigentum'),
  181. ('GTMIET', 'Getrennte Mietvertäge (Verein mietet GR)'),
  182. ]
  183. WOHNBAUFOERDERUNG = [
  184. ('Gefördert', 'Gefördert'),
  185. ('Nicht Gefördert', 'Nicht Gefördert'),
  186. ]
  187. ALTNEU = [
  188. ('ALTB', 'Altbau'),
  189. ('NEUB', 'Neubau'),
  190. ]
  191. ARTMODELL =[
  192. ('Die Wohnungen werden individiuell von einem Bauträger angemietet / Gemeinschaftsräume werden gemeinsam angemietetet', 'Die Wohnungen werden individiuell von einem Bauträger angemietet / Gemeinschaftsräume werden gemeinsam angemietetet'),
  193. ('Die Gemeinschaft mietet das ganze Haus oder Teile davon vom Bauträger (z.b. in Form eines Generalmietvetrages). Die Gemeinschaft schließt indiviudelle Nutzungsverträge mit den NutzerInnen ab. (Wird oft so bei Wohnheimen gemacht)', 'Die Gemeinschaft mietet das ganze Haus oder Teile davon vom Bauträger (z.b. in Form eines Generalmietvetrages). Die Gemeinschaft schließt indiviudelle Nutzungsverträge mit den NutzerInnen ab. (Wird oft so bei Wohnheimen gemacht)'),
  194. ('Der Bau erfolgt durch einen Bauträger. Die Gemeinschaft erwirbt das Gebäude und das Grundstück im Eigentum und schließt individuelle Nutzungsverträge mit den NutzerInenn ab.', 'Der Bau erfolgt durch einen Bauträger. Die Gemeinschaft erwirbt das Gebäude und das Grundstück im Eigentum und schließt individuelle Nutzungsverträge mit den NutzerInenn ab.'),
  195. ('Der Bau erfolgt ohne Bauträger. Die Gemeinschaft erwirbt das Grundstück im Eigentum und baut auf eigene Rechnung und Risiko. Die Gemeinschaft schließt individuelle Nutzungsverträge mit den NutzerInenn ab.', 'Der Bau erfolgt ohne Bauträger. Die Gemeinschaft erwirbt das Grundstück im Eigentum und baut auf eigene Rechnung und Risiko. Die Gemeinschaft schließt individuelle Nutzungsverträge mit den NutzerInenn ab.'),
  196. ('Es gibt ein individuelles Eigentum an den jeweiligen Wohnungen. Die Eigentümergemeinschaft nutzt und erhält Gemeinschaftsräume.', 'Es gibt ein individuelles Eigentum an den jeweiligen Wohnungen. Die Eigentümergemeinschaft nutzt und erhält Gemeinschaftsräume.'),
  197. ('Modell Habitat', 'Modell Habitat'),
  198. ('Anderes Modell', 'Anderes Modell'),
  199. ]
  200. BAUTRAEGER = [
  201. ('Altmannsdorf - Hetzendorf Gemn. Siedlungsgen.m.b.H', 'Altmannsdorf - Hetzendorf Gemn. Siedlungsgen.m.b.H'),
  202. ('EBG Gemn. Ein und Mehrfam. Häuser Baugen.reg..Gen.mbH', 'EBG Gemn. Ein und Mehrfam. Häuser Baugen.reg..Gen.mbH'),
  203. ('EGW-Heimstätte Gesellschaft m.b.H.', 'EGW-Heimstätte Gesellschaft m.b.H.'),
  204. ('FAMILIENWOHNBAU gemeinnützige Bau- und Siedlungsges. m.b.H.', 'FAMILIENWOHNBAU gemeinnützige Bau- und Siedlungsges. m.b.H.'),
  205. ('GARTENHEIM Gemeinn. Familienhäuser Bau- u. Wohnungen regGenmbH', 'GARTENHEIM Gemeinn. Familienhäuser Bau- u. Wohnungen regGenmbH'),
  206. ('Migra Gemn. Bau und SiedlungsgesmbH', 'Migra Gemn. Bau und SiedlungsgesmbH'),
  207. ('ÖVW Österr. Volkswohnungswerk Gemeinn. Ges mbH', 'ÖVW Österr. Volkswohnungswerk Gemeinn. Ges mbH'),
  208. ('SCHWARZATAL Gemeinnützige Wohnungs- u. Siedlungsanlagen GmbH', 'SCHWARZATAL Gemeinnützige Wohnungs- u. Siedlungsanlagen GmbH'),
  209. ('WBV-GPA Wohnbauvereinigung für Privatangestellte Gemn. Ges.m.b.H', 'WBV-GPA Wohnbauvereinigung für Privatangestellte Gemn. Ges.m.b.H'),
  210. ('WOGEN - Wohnprojekte-Genossenschaft e. Gen.', 'WOGEN - Wohnprojekte-Genossenschaft e. Gen.'),
  211. ('Sonstiges', 'Sonstiges'),
  212. ]
  213. GEMEINSCHAFTR = [
  214. ('Gemeinschaftsküche', 'Gemeinschaftsküche'),
  215. ('Kinderspielraum', 'Kinderspielraum'),
  216. ('Sauna / Wellness', 'Sauna / Wellness'),
  217. ('Fitnessraum', 'Fitnessraum'),
  218. ('Werkstatt', 'Werkstatt'),
  219. ('Waschküche', 'Waschküche'),
  220. ('Multifunktionsraum', 'Multifunktionsraum'),
  221. ('Musikraum', 'Musikraum'),
  222. ('Gästewohnung', 'Gästewohnung'),
  223. ('Raum für Home-Office', 'Raum für Home-Office'),
  224. ('Sonstiges', 'Sonstiges'),
  225. ]
  226. RAUMANGEBOT = [
  227. ('Co-Working', 'Co-Working'),
  228. ('Geschäftslokal(e)', 'Geschäftslokal(e)'),
  229. ('Büros', 'Büros'),
  230. ('Veranstaltungsraum', 'Veranstaltungsraum'),
  231. ('Gemeinschaftsküche', 'Gemeinschaftsküche'),
  232. ('Kinderspielraum', 'Kinderspielraum'),
  233. ('Sauna / Wellness', 'Sauna / Wellness'),
  234. ('Fitnessraum', 'Fitnessraum'),
  235. ('Werkstatt', 'Werkstatt'),
  236. ('Waschküche', 'Waschküche'),
  237. ('Musikraum', 'Musikraum'),
  238. ('Gästewohnung', 'Gästewohnung'),
  239. ]
  240. BAUWEISE = [
  241. ('Holz', 'Holz'),
  242. ('Beton', 'Beton'),
  243. ('Ziegel', 'Ziegel'),
  244. ('Mischbauweise', 'Mischbauweise'),
  245. ('Sonstiges', 'Sonstiges'),
  246. ]
  247. ZIELGRUPPEN = [
  248. ('Seniorinnen', 'Seniorinnen'),
  249. ('Alleinerziehende', 'Alleinerziehende'),
  250. ('Geflüchtete', 'Geflüchtete'),
  251. ('Sonstige', 'Sonstige'),
  252. ]
  253. GPROJEKTE = [
  254. ('Foodcoop', 'Foodcoop'),
  255. ('Carsharing', 'Carsharing'),
  256. ('Urban Gardening', 'Urban Gardening'),
  257. ('Sonstiges', 'Sonstiges'),
  258. ]
  259. FREIANGEBOT = [
  260. ('Dachterrasse', 'Dachterrasse'),
  261. ('Beete', 'Beete'),
  262. ('Kinderspielplatz', 'Kinderspielplatz'),
  263. ]
  264. @property
  265. def kind_of_product(self):
  266. return "Wohnprojekt"
  267. eigentum = CharField ( 'Rechtliche Konstruktion', max_length = 6, choices=EIGENTUM, default='GEMIET', help_text="Rechtliche Konstruktion", null = True, blank=True )
  268. inseratstext = TextField ( 'Inseratstext', max_length = 1024, help_text="Inseratstext", null = True, blank=True )
  269. altneu = CharField ( 'Altbau/Neubau', max_length = 4, choices=ALTNEU, help_text="Altbau/Neubau", null = True, blank=False )
  270. schwerpunkt = CharField ( 'Inhaltlicher Schwerpunkt', max_length = 1024, help_text="Inhaltlicher Schwerpunkt", null = True, blank=True )
  271. wohnbaufoerderung = CharField ( 'Wohnbauförderung', max_length = 1024, choices=WOHNBAUFOERDERUNG, help_text="Wohnbauförderung", null = True, blank=True )
  272. artmodell = TextField ( 'Art der Modells', max_length = 2048, help_text="Art der Modells", null = True, blank=True )
  273. bautraeger = TextField ( 'Bauträger', max_length = 2048, help_text="Bauträger", null = True, blank=True )
  274. aerwachsene = IntegerField( 'Anzahl an Erwachsenen', help_text="Anzahl an Erwachsenen", validators=[MinValueValidator(0), MaxValueValidator(9999)], default = 0, null = True, blank=False )
  275. akinder = IntegerField( 'Anzahl an Kinder', help_text="Anzahl an Kinder", validators=[MinValueValidator(0), MaxValueValidator(9999)], default = 0, null = True, blank=False )
  276. @property
  277. def amitglieder(self):
  278. return self.aerwachsene + self.akinder
  279. awohnungen = IntegerField( 'Anzahl an Wohnungen', help_text="Anzahl an Wohnungen", validators=[MinValueValidator(0), MaxValueValidator(9999)], null = True, blank=True )
  280. wohnflaeche = IntegerField( 'Wohnfläche', help_text="Wohnfläche", validators=[MinValueValidator(0)], default = 0, null = True, )
  281. gewerbeflaechen = IntegerField( 'Gewerbeflächen', help_text="Gewerbeflächen", validators=[MinValueValidator(0)], default = 0, null = True, )
  282. gemeinschaftsflaeche = IntegerField( 'Gemeinschaftsflächen', help_text="Gemeinschaftsflächen", validators=[MinValueValidator(0)], default = 0, null = True, )
  283. sonstige_flaechen = IntegerField( 'Sonstige Flächen', help_text="Sonstige Flächen", validators=[MinValueValidator(0)], default = 0, null = True, )
  284. @property
  285. def flaeche(self):
  286. return self.wohnflaeche + self.gewerbeflaechen + self.gemeinschaftsflaeche + self.sonstige_flaechen
  287. kflaechen = CharField ( 'Flächen - Kommentar', max_length = 1024, help_text="Flächen - Kommentar", null = True, blank=True )
  288. gemeinschaftr = MultiSelectField ( 'Gemeinschaftsräume', max_length = 1024, choices=GEMEINSCHAFTR, help_text="Gemeinschaftsräume", null = True, blank=True )
  289. kgemeinschaftr = CharField ( 'Gemeinschaftsräume - Sonstiges', max_length = 1024, help_text="Gemeinschaftsräume - Sonstiges", null = True, blank=True )
  290. sonderwohnformen = CharField ( 'Sonderwohnformen', max_length = 1024, help_text="Sonderwohnformen, z.B. Wohncluster, WGs, Sonstiges", null = True, blank=True )
  291. raumangebot = MultiSelectField ( 'Raumangebot nach Außen', max_length = 1024, choices=RAUMANGEBOT, help_text="Raumangebot nach Außen", null = True, blank=True )
  292. kraumangebot = CharField ( 'Raumangebot nach Außen - Sonstiges', max_length = 1024, help_text="Raumangebot nach Außen - Sonstiges", null = True, blank=True )
  293. parbeiten = IntegerField ( 'Wie viele Personen arbeiten im Haus', help_text="Wie viele Personen arbeiten im Haus", validators=[MinValueValidator(0), MaxValueValidator(9999)], null = True, blank=True )
  294. karbeiten = CharField ( 'Wie viele Personen arbeiten im Haus - Kommentar', max_length = 1024, help_text="Kommentar", null = True, blank=True )
  295. bauweise = CharField ( 'Bauweise', max_length = 64, help_text="Bauweise", null = True, blank=True )
  296. zielgruppen = CharField ( 'Besondere Zielgruppen', max_length = 64, help_text="Besondere Zielgruppen", null = True, blank=True )
  297. gprojekte = CharField ( 'Gemeinschaftliche Projekte', max_length = 64, help_text="Gemeinschaftliche Projekte", null = True, blank=True )
  298. oekologie = CharField ( 'Ökologie', max_length = 1024, help_text="Ökologie", null = True, blank=True )
  299. freiraumangebote = CharField ( 'Freiraumangebote', max_length = 64, choices=FREIANGEBOT, help_text="Freiraumangebote", null = True, blank=True )
  300. gaestwohnungen = IntegerField ( 'Anzahl an Gästewohnungen', help_text="Anzahl an Gästewohnungen", validators=[MinValueValidator(0)], default = 0 )
  301. class Link(models.Model):
  302. product = ForeignKey(Product, on_delete=models.CASCADE)
  303. link_description = CharField(null=True, blank=True, max_length = 2048)
  304. link = URLField(null=True, blank=True, max_length = 2048)
  305. def product_path(instance, filename):
  306. return 'marktplatz/media/{0}/{1}'.format(instance.product.id, filename)
  307. class Media(models.Model):
  308. fs = FileSystemStorage(location=settings.MEDIA_ROOT)
  309. product = ForeignKey(Product, on_delete=models.CASCADE)
  310. name_for = CharField(blank = True,max_length = 256)
  311. filename = CharField(max_length = 100)
  312. copyright = CharField(blank=True, max_length = 100)
  313. image = ImageField(upload_to=product_path,storage=fs)
  314. image_small = ProcessedImageField(upload_to=product_path,
  315. processors=[ResizeToCover(640, 360)],
  316. format='JPEG',
  317. options={'quality': 90})
  318. image_medium= ProcessedImageField(upload_to=product_path,
  319. processors=[ResizeToCover(960, 540)],
  320. format='JPEG',
  321. options={'quality': 90})
  322. image_big = ProcessedImageField(upload_to=product_path,
  323. processors=[ResizeToCover(1920, 1080)],
  324. format='JPEG',
  325. options={'quality': 90})
  326. image_norm = ProcessedImageField(upload_to=product_path,
  327. processors=[Thumbnail(640, 360)],
  328. format='JPEG',
  329. options={'quality': 90},
  330. blank = True,
  331. null = True)
  332. def filename(self):
  333. return os.path.basename(self.image.name).split('.')[0]
  334. # These two auto-delete files from filesystem when they are unneeded:
  335. #
  336. @receiver(models.signals.post_delete, sender=Media)
  337. def auto_delete_file_on_delete(sender, instance, **kwargs):
  338. """
  339. Deletes file from filesystem
  340. when corresponding `MediaFile` object is deleted.
  341. """
  342. if instance.image:
  343. if os.path.isfile(instance.image.path):
  344. os.remove(instance.image.path)
  345. #
  346. if instance.image_small:
  347. if os.path.isfile(instance.image_small.path):
  348. os.remove(instance.image_small.path)
  349. #
  350. if instance.image_medium:
  351. if os.path.isfile(instance.image_medium.path):
  352. os.remove(instance.image_medium.path)
  353. #
  354. if instance.image_big:
  355. if os.path.isfile(instance.image_big.path):
  356. os.remove(instance.image_big.path)
  357. #
  358. if instance.image_norm:
  359. if os.path.isfile(instance.image_norm.path):
  360. os.remove(instance.image_norm.path)
  361. #
  362. #print(settings.MEDIA_ROOT+'/marktplatz/media/{0}/{1}'.format(instance.Product.id, instance.image.name))
  363. #print(instance.Product.id, instance.image.path)
  364. #os.remove(settings.MEDIA_ROOT+'/marktplatz/media/{0}/{1}_big'.format(instance.Product.id, instance.filename))
  365. #os.remove(settings.MEDIA_ROOT+'/marktplatz/media/{0}/{1}.jpg'.format(instance.Product.id, instance.image.name))
  366. class Video(models.Model):
  367. product = ForeignKey(Product, on_delete=models.CASCADE)
  368. name_for = CharField(blank=True, max_length=256)
  369. filename = CharField(max_length=100)
  370. copyright = CharField(blank=True, max_length=100)
  371. image = FileField(upload_to=product_path)
  372. @receiver(models.signals.post_delete, sender=Video)
  373. def auto_delete_video_on_delete(sender, instance, **kwargs):
  374. """
  375. Deletes file from filesystem
  376. when corresponding `MediaFile` object is deleted.
  377. """
  378. if instance.image:
  379. if os.path.isfile(instance.image.path):
  380. os.remove(instance.image.path)
  381. class Vote(models.Model):
  382. product = ForeignKey(Product, on_delete=models.CASCADE)
  383. juryMember = ForeignKey(User, on_delete = models.CASCADE)
  384. vote = PositiveSmallIntegerField(default=0)
  385. comment = CharField(blank=True, max_length =300)
  386. def __iter__(self):
  387. for field in self._meta.fields:
  388. yield (field.verbose_name, field.value_to_string(self))
  389. class Credit(models.Model):
  390. owner = CharField(verbose_name='Building or Product owner',blank=True,max_length = 300)
  391. architecture = CharField(verbose_name='Architecture',blank=True,max_length = 300)
  392. concept = CharField(verbose_name='Product artist/ concept/ design/ planning',blank=True,max_length = 300)
  393. structural_engeneering = CharField(verbose_name='Structural engineering',blank=True,max_length = 300)
  394. facade_design = CharField(verbose_name='Facade design',blank=True,max_length = 300)
  395. face_construction = CharField(verbose_name='Facade construction',blank=True,max_length = 300)
  396. kinetic_design = CharField(verbose_name='Kinetic engineering',blank = True,max_length = 300)
  397. light_design = CharField(verbose_name='Light design',blank = True,max_length = 300)
  398. tecnical_layout = CharField(verbose_name='Technical layout light',blank = True,max_length = 300)
  399. display_content = CharField(verbose_name='Display content/ visuals/ showreel',blank = True,max_length = 300)
  400. light_hardware = CharField(verbose_name='Light hardware (LED hardware)',blank = True,max_length = 300)
  401. lightning_software = CharField(verbose_name='Lighting control software',blank = True,max_length = 300)
  402. product_coordination = CharField(verbose_name='Product co-ordination',blank = True,max_length = 300)
  403. membrane_skin = CharField(verbose_name='Membrane skin',blank = True,max_length = 300)
  404. interaction_design = CharField(verbose_name='Interaction design/ programming',blank = True,max_length = 300)
  405. sponsor = CharField(verbose_name='Product sponsor/ support',blank = True,max_length = 500)
  406. module_elems = CharField(verbose_name='Pixel or other basic module/ elements',blank = True,max_length = 300)
  407. def __iter__(self):
  408. for field in self._meta.fields:
  409. if field.value_to_string(self) != '-' and field.value_to_string(self) != 'N/A':
  410. yield (field.verbose_name, field.value_to_string(self))
  411. class Interaction(models.Model):
  412. communtity = TextField(verbose_name='Community or communities involved',blank = True,max_length = 900)
  413. host = CharField(verbose_name='Host organization',blank = True,max_length = 900)
  414. legal_form = CharField(verbose_name='Legal form',blank=True,max_length = 900)
  415. issues = TextField(verbose_name='Issues addressed',blank = True,max_length = 900)
  416. impact = TextField(verbose_name='Impact',blank = True,max_length = 900)
  417. tools = TextField(verbose_name='Tools developed',blank = True,max_length = 900)
  418. tools_used = TextField(verbose_name='Tools used',blank = True,max_length = 900)
  419. next_steps = TextField(verbose_name='Next steps',blank = True,max_length = 900)
  420. def __iter__(self):
  421. for field in self._meta.fields:
  422. if (field.value_to_string(self) != '-') and (field.value_to_string(self) != 'N/A'):
  423. yield (field.verbose_name, field.value_to_string(self))