models.py 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656
  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.db import models
  11. from django.dispatch import receiver
  12. from django.db.models.signals import post_delete, post_save
  13. from django.conf import settings
  14. from multiselectfield import MultiSelectField
  15. from imagekit.models import ImageSpecField
  16. from imagekit.processors import ResizeToFill
  17. from imagekit.processors import ResizeToCover
  18. from imagekit.processors import Thumbnail
  19. from imagekit.processors import ResizeToCover
  20. from imagekit.models import ProcessedImageField
  21. from marktplatz.widgets import *
  22. class Credit(models.Model):
  23. owner = CharField(verbose_name='Building or Product owner',blank=True,max_length = 300)
  24. architecture = CharField(verbose_name='Architecture',blank=True,max_length = 300)
  25. concept = CharField(verbose_name='Product artist/ concept/ design/ planning',blank=True,max_length = 300)
  26. structural_engeneering = CharField(verbose_name='Structural engineering',blank=True,max_length = 300)
  27. facade_design = CharField(verbose_name='Facade design',blank=True,max_length = 300)
  28. face_construction = CharField(verbose_name='Facade construction',blank=True,max_length = 300)
  29. kinetic_design = CharField(verbose_name='Kinetic engineering',blank = True,max_length = 300)
  30. light_design = CharField(verbose_name='Light design',blank = True,max_length = 300)
  31. tecnical_layout = CharField(verbose_name='Technical layout light',blank = True,max_length = 300)
  32. display_content = CharField(verbose_name='Display content/ visuals/ showreel',blank = True,max_length = 300)
  33. light_hardware = CharField(verbose_name='Light hardware (LED hardware)',blank = True,max_length = 300)
  34. lightning_software = CharField(verbose_name='Lighting control software',blank = True,max_length = 300)
  35. product_coordination = CharField(verbose_name='Product co-ordination',blank = True,max_length = 300)
  36. membrane_skin = CharField(verbose_name='Membrane skin',blank = True,max_length = 300)
  37. interaction_design = CharField(verbose_name='Interaction design/ programming',blank = True,max_length = 300)
  38. sponsor = CharField(verbose_name='Product sponsor/ support',blank = True,max_length = 500)
  39. module_elems = CharField(verbose_name='Pixel or other basic module/ elements',blank = True,max_length = 300)
  40. def __iter__(self):
  41. for field in self._meta.fields:
  42. if field.value_to_string(self) != '-' and field.value_to_string(self) != 'N/A':
  43. yield (field.verbose_name, field.value_to_string(self))
  44. class Description(models.Model):
  45. facade = TextField(verbose_name='Facade type and geometry (structure)',blank = True,max_length = 900)
  46. light_creation = TextField(verbose_name='Kind of light creation',blank = True,max_length = 900)
  47. resolution = TextField(verbose_name='Resolution and transmitting behaviour',blank = True,max_length = 900)
  48. pixel_distance = CharField(verbose_name='Pixel distance',blank = True,max_length = 300)
  49. luminance = TextField(verbose_name='Luminace',blank = True,max_length = 900)
  50. urban_situation = TextField(verbose_name='Urban situation',blank = True,max_length = 900)
  51. description_showreel = TextField(verbose_name='Description of showreel',blank = True,max_length = 900)
  52. def __iter__(self):
  53. for field in self._meta.fields:
  54. if (field.value_to_string(self) != '-') and (field.value_to_string(self) != 'N/A'):
  55. yield (field.verbose_name, field.value_to_string(self))
  56. class Interaction(models.Model):
  57. communtity = TextField(verbose_name='Community or communities involved',blank = True,max_length = 900)
  58. host = CharField(verbose_name='Host organization',blank = True,max_length = 900)
  59. legal_form = CharField(verbose_name='Legal form',blank=True,max_length = 900)
  60. issues = TextField(verbose_name='Issues addressed',blank = True,max_length = 900)
  61. impact = TextField(verbose_name='Impact',blank = True,max_length = 900)
  62. tools = TextField(verbose_name='Tools developed',blank = True,max_length = 900)
  63. tools_used = TextField(verbose_name='Tools used',blank = True,max_length = 900)
  64. next_steps = TextField(verbose_name='Next steps',blank = True,max_length = 900)
  65. def __iter__(self):
  66. for field in self._meta.fields:
  67. if (field.value_to_string(self) != '-') and (field.value_to_string(self) != 'N/A'):
  68. yield (field.verbose_name, field.value_to_string(self))
  69. class Contact(models.Model):
  70. user = OneToOneField(User, on_delete=models.CASCADE,blank=True)
  71. first_name = CharField(verbose_name="Vorname", max_length = 100)
  72. last_name = CharField(verbose_name="Nachname", max_length = 100)
  73. adress = CharField(verbose_name="Adresse", blank=True,max_length = 100)
  74. postcode = CharField(verbose_name="Postleitzahl", blank=True, max_length = 100)
  75. city = CharField(verbose_name="Stadt", blank=True,max_length = 100)
  76. country = CharField(verbose_name="Land", blank=True,max_length = 100)
  77. email = EmailField(verbose_name="E-Mail-Addresse", unique=True)
  78. phonenumber = CharField(verbose_name="1. Telefonnummer", blank=True,max_length = 100)
  79. alternate_phonenumber = CharField(verbose_name="2. Telefonnummer", blank = True,max_length = 100)
  80. skype_name = CharField(verbose_name="Skype", blank=True,max_length = 300)
  81. website = URLField(verbose_name="Website", blank=True)
  82. def __str__(self):
  83. return self.first_name + ' ' + self.last_name
  84. def __iter__(self):
  85. for field in self._meta.fields:
  86. yield (field.verbose_name, field.value_to_string(self))
  87. class Category(models.Model):
  88. name = CharField(max_length=100)
  89. short_name = CharField(max_length=10)
  90. def __str__(self):
  91. return self.name
  92. class Product(models.Model):
  93. # def save(self, update_fields=None, *args, **kwargs):
  94. # print(kwargs)
  95. # print(args)
  96. # print (update_fields)
  97. # # update_fields = ['frei']
  98. # super().save(*args, **kwargs) # Call the "real" save() method.
  99. #https://stackoverflow.com/questions/1355150/when-saving-how-can-you-check-if-a-field-has-changed
  100. __original_frei = None
  101. def __init__(self, *args, **kwargs):
  102. super(Product, self).__init__(*args, **kwargs)
  103. self.__original_frei = self.frei
  104. def save(self, force_insert=False, force_update=False, *args, **kwargs):
  105. if self.frei != self.__original_frei:
  106. if self.frei == "JAJA":
  107. for agent in SearchAgent.objects.all():
  108. for agentOrt in agent.ort:
  109. print(agentOrt)
  110. if agentOrt == self.ort:
  111. print ('send_mail')
  112. # context []
  113. # context ['base_uri'] = self.request.build_absolute_uri( '/' ).rstrip('/')
  114. # context['recipient'] = [ myActivity.contact.email, ]
  115. # context['msg_subject' ] = _('Activity created')
  116. # context['msg_content' ] = "\n" + "<br/>" + \
  117. # _("Title: ") + form.cleaned_data['title'] + "\n" + "<br/><br/>" + \
  118. # _('Description: ') + form.cleaned_data['description'] + "\n" + "<br/>"
  119. #
  120. # mail.send(
  121. # context['recipient'],
  122. # config.EMAIL_NOREPLY,
  123. # context = context,
  124. # template='generic',
  125. # headers={ 'Reply-To': context['email'] },
  126. # priority='now',
  127. # )
  128. super(Product, self).save(force_insert, force_update, *args, **kwargs)
  129. self.__original_frei = self.frei
  130. STATUS = [
  131. ('ENT', 'Entwicklung'),
  132. ('BET', 'In Betrieb'),
  133. ('ABG', 'Abgeschlossen'),
  134. ]
  135. FREI = [
  136. ('JAJA', 'Ja, bitte melden'),
  137. ('WART', 'Nein, aber es gibt eine Warteliste'),
  138. ('NEIN', 'Nein und es gibt keine Warteliste'),
  139. ]
  140. RECHTSFORM = [
  141. ('GmbH', 'GmbH'),
  142. ('Verein', 'Verein'),
  143. ('Genossenschaft', 'Genossenschaft'),
  144. ('GbR', 'GbR'),
  145. ('Sonstiges', 'Sonstiges'),
  146. ]
  147. ORT = [
  148. ('1010', '1., Innere Stadt'),
  149. ('1020', '2., Leopoldstadt'),
  150. ('1030', '3., Landstraße'),
  151. ('1040', '4., Wieden'),
  152. ('1050', '5., Margareten'),
  153. ('1060', '6., Mariahilf'),
  154. ('1070', '7., Neubau'),
  155. ('1080', '8., Josefstadt'),
  156. ('1090', '9., Alsergrund'),
  157. ('1100', '10., Favoriten'),
  158. ('1110', '11., Simmering'),
  159. ('1120', '12., Meidling'),
  160. ('1130', '13., Hietzing'),
  161. ('1140', '14., Penzing'),
  162. ('1150', '15., Rudolfsheim-Fünfhaus'),
  163. ('1160', '16., Ottakring'),
  164. ('1170', '17., Hernals'),
  165. ('1180', '18., Währing'),
  166. ('1190', '19., Döbling'),
  167. ('1200', '20., Brigittenau'),
  168. ('1210', '21., Floridsdorf'),
  169. ('1220', '22., Donaustadt'),
  170. ('1230', '23., Liesing'),
  171. ('GERM', 'Deutschland'),
  172. ('SCHW', 'Schweiz'),
  173. ('GERM', 'Germany'),
  174. ('GERM', 'Germany'),
  175. ('VORA', 'Vorarlberg'),
  176. ('TIRO', 'Tirol'),
  177. ('SALZ', 'Salzburg'),
  178. ('KAER', 'Kärnten'),
  179. ('STEI', 'Steiermark'),
  180. ('OBER', 'Oberösterreich'),
  181. ('NIER', 'Niederösterreich'),
  182. ('BURG', 'Burgenland'),
  183. ('WELT', 'Welt'),
  184. ]
  185. ORGANIZATION = [
  186. ('Soziokratie', 'Soziokratie'),
  187. ('Sonstiges', 'Sonstiges'),
  188. ]
  189. @property
  190. def kind_of_product(self):
  191. return "Allgemeines Produkt"
  192. name = CharField( 'Name', max_length = 128, help_text="Name des Projekts", null = True, blank=True )
  193. claim = CharField( 'Claim / Untertitel', max_length = 256, help_text="Claim / Untertitel", null = True, blank=True )
  194. beschreibung = TextField( 'Beschreibung', max_length = 4096, help_text="Beschreibung des Projektes", null = True, blank=True )
  195. learning = CharField( 'Learning', max_length = 256, help_text="Learning", null = True, blank=True )
  196. gruendungsjahr = IntegerField('Gründungsjahr', help_text="Gründungsjahr des Projekts", validators=[MinValueValidator(0), MaxValueValidator(9999)], null = True, blank=True )
  197. 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 )
  198. status = CharField( 'Status', max_length = 3, choices=STATUS, default='ENT', help_text="Was ist der Status des Projektes" , null = True, blank=True )
  199. adresse = CharField( 'Adresse', max_length = 256, help_text="Adresse des Projektes", null = True, blank=True )
  200. plz = CharField ( 'Adresse', max_length = 256, help_text="PLZ des Projektes", null = True, blank=True )
  201. adresse_zusatz = CharField ( 'Adresse Zusatz', max_length = 256, help_text="Adresse Zusatz", null = True, blank=True )
  202. ort = CharField ( 'Ort', max_length = 4, choices=ORT, default='WELT', help_text="Ort des Projektes", null = True, blank=True )
  203. website = URLField ( 'Website', max_length = 2048, help_text="Website des Projektes", null = True, blank=True )
  204. email = EmailField ( 'Email', max_length = 2048, help_text="Email des Projektes", null = True, blank=True )
  205. frei = CharField ( 'Platz frei', max_length = 4, choices=FREI, default='NEIN', help_text="Gibt es freie Plätze?", null = True, blank=False )
  206. kfrei = CharField ( 'Platz frei - Kommentar', max_length = 2048, help_text="Kommentar", null = True, blank=True )
  207. rechtsform = CharField ( 'Rechtsform', max_length = 32, help_text="Rechtsform des Projektes", null = True, blank=True )
  208. orga = CharField ( 'Organisationsform', max_length = 256, help_text="Organisationsform des Projektes.", null = True, blank=True )
  209. mitmachen = BooleanField( 'Mitmachen möglich', default=False, help_text="Kann jemand mitmachen?", null = True, blank=False )
  210. terms = NullBooleanField(help_text="")
  211. title = CharField('Product Title',max_length = 100,null = True, blank=True)
  212. country = CountryField(blank=True,multiple=True, help_text="")
  213. city = CharField(max_length = 100,null = True, blank=True, help_text="")
  214. year = IntegerField('Year of Completion',null = True, blank=True, help_text="")
  215. owner = CharField(max_length = 300,null = True,blank=True, help_text="")
  216. teaser_txt = TextField(blank = True, max_length = 1050, help_text="")
  217. header = CharField(max_length = 900 , help_text="",null = True, blank=True)
  218. description_txt = TextField(max_length = 3000 ,null = True, blank=True, help_text="")
  219. #cid = IntegerField(null = True,blank=True, help_text="")
  220. class_cid = CharField(null = True,max_length = 3, blank=True, help_text="")
  221. sumbitted = CharField(null = True,max_length = 10, blank=True, help_text="")
  222. date_submitted = DateField(auto_now_add=True, help_text="")
  223. edit = NullBooleanField(help_text="")
  224. public = NullBooleanField(help_text="")
  225. photo = CharField(max_length=500, null=True, blank=True, help_text="")
  226. videocts = CharField(max_length=500, null=True, blank=True, help_text="")
  227. category = ManyToManyField(Category, help_text="",null = True, blank=True)
  228. credits = ForeignKey(Credit, null = True,on_delete=models.SET_NULL, help_text="")
  229. description = ForeignKey(Description, on_delete=models.SET_NULL, help_text="",null = True, blank=True)
  230. contact = ForeignKey(Contact, null = True,on_delete=models.SET_NULL, help_text="")
  231. #interaction = ForeignKey(Interaction, null = True,on_delete = models.SET_NULL, help_text="")
  232. def __str__(self):
  233. return str(self.name)
  234. def __iter__(self):
  235. for field in self._meta.fields:
  236. yield (field.verbose_name, field.value_to_string(self))
  237. def get_field_verbose_name(self, fieldName):
  238. return self._meta.get_field(fieldName).verbose_name
  239. def meta(self):
  240. return self._meta
  241. @receiver(post_delete, sender=Product)
  242. def auto_delete_reverse_keys(sender, instance, **kwargs):
  243. if instance.credits:
  244. instance.credits.delete()
  245. if instance.description:
  246. instance.description.delete()
  247. if instance.interaction:
  248. instance.interaction.delete()
  249. @receiver(post_save, sender=Product)
  250. def search_agent(sender, instance, created, raw, using, update_fields, **kwargs):
  251. print(instance)
  252. print(sender)
  253. print(update_fields)
  254. if update_fields != None:
  255. print(update_fields)
  256. if 'frei' in update_fields:
  257. print('frei updated')
  258. class SearchAgent(models.Model):
  259. def hash_gen():
  260. return uuid.uuid1().hex
  261. email = EmailField ( 'Email', max_length = 2048, help_text="Email des Projektes", null = False, blank=False )
  262. ort = MultiSelectField ( 'Ort', max_length = 4096 , choices=Product.ORT, default='WELT', help_text="Ort des Projektes", null = True, blank=False )
  263. hash = CharField ( max_length=255, default=hash_gen )
  264. class Wohnprojekt(Product):
  265. EIGENTUM = [
  266. ('GEMIET', 'Generalmiete'),
  267. ('WOHNHM', 'Wohnheim'),
  268. ('EIGENT', 'Eigentum'),
  269. ('GTMIET', 'Getrennte Mietvertäge (Verein mietet GR)'),
  270. ]
  271. WOHNBAUFOERDERUNG = [
  272. ('Gefördert', 'Gefördert'),
  273. ('Nicht Gefördert', 'Nicht Gefördert'),
  274. ]
  275. ALTNEU = [
  276. ('ALTB', 'Altbau'),
  277. ('NEUB', 'Neubau'),
  278. ]
  279. ARTMODELL =[
  280. ('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'),
  281. ('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)'),
  282. ('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.'),
  283. ('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.'),
  284. ('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.'),
  285. ('Modell Habitat', 'Modell Habitat'),
  286. ('Anderes Modell', 'Anderes Modell'),
  287. ]
  288. BAUTRAEGER = [
  289. ('Altmannsdorf - Hetzendorf Gemn. Siedlungsgen.m.b.H', 'Altmannsdorf - Hetzendorf Gemn. Siedlungsgen.m.b.H'),
  290. ('EBG Gemn. Ein und Mehrfam. Häuser Baugen.reg..Gen.mbH', 'EBG Gemn. Ein und Mehrfam. Häuser Baugen.reg..Gen.mbH'),
  291. ('EGW-Heimstätte Gesellschaft m.b.H.', 'EGW-Heimstätte Gesellschaft m.b.H.'),
  292. ('FAMILIENWOHNBAU gemeinnützige Bau- und Siedlungsges. m.b.H.', 'FAMILIENWOHNBAU gemeinnützige Bau- und Siedlungsges. m.b.H.'),
  293. ('GARTENHEIM Gemeinn. Familienhäuser Bau- u. Wohnungen regGenmbH', 'GARTENHEIM Gemeinn. Familienhäuser Bau- u. Wohnungen regGenmbH'),
  294. ('Migra Gemn. Bau und SiedlungsgesmbH', 'Migra Gemn. Bau und SiedlungsgesmbH'),
  295. ('ÖVW Österr. Volkswohnungswerk Gemeinn. Ges mbH', 'ÖVW Österr. Volkswohnungswerk Gemeinn. Ges mbH'),
  296. ('SCHWARZATAL Gemeinnützige Wohnungs- u. Siedlungsanlagen GmbH', 'SCHWARZATAL Gemeinnützige Wohnungs- u. Siedlungsanlagen GmbH'),
  297. ('WBV-GPA Wohnbauvereinigung für Privatangestellte Gemn. Ges.m.b.H', 'WBV-GPA Wohnbauvereinigung für Privatangestellte Gemn. Ges.m.b.H'),
  298. ('WOGEN - Wohnprojekte-Genossenschaft e. Gen.', 'WOGEN - Wohnprojekte-Genossenschaft e. Gen.'),
  299. ('Sonstiges', 'Sonstiges'),
  300. ]
  301. GEMEINSCHAFTR = [
  302. ('Gemeinschaftsküche', 'Gemeinschaftsküche'),
  303. ('Kinderspielraum', 'Kinderspielraum'),
  304. ('Sauna / Wellness', 'Sauna / Wellness'),
  305. ('Fitnessraum', 'Fitnessraum'),
  306. ('Werkstatt', 'Werkstatt'),
  307. ('Waschküche', 'Waschküche'),
  308. ('Multifunktionsraum', 'Multifunktionsraum'),
  309. ('Musikraum', 'Musikraum'),
  310. ('Gästewohnung', 'Gästewohnung'),
  311. ('Raum für Home-Office', 'Raum für Home-Office'),
  312. ('Sonstiges', 'Sonstiges'),
  313. ]
  314. RAUMANGEBOT = [
  315. ('Co-Working', 'Co-Working'),
  316. ('Geschäftslokal(e)', 'Geschäftslokal(e)'),
  317. ('Büros', 'Büros'),
  318. ('Veranstaltungsraum', 'Veranstaltungsraum'),
  319. ('Gemeinschaftsküche', 'Gemeinschaftsküche'),
  320. ('Kinderspielraum', 'Kinderspielraum'),
  321. ('Sauna / Wellness', 'Sauna / Wellness'),
  322. ('Fitnessraum', 'Fitnessraum'),
  323. ('Werkstatt', 'Werkstatt'),
  324. ('Waschküche', 'Waschküche'),
  325. ('Musikraum', 'Musikraum'),
  326. ('Gästewohnung', 'Gästewohnung'),
  327. ]
  328. BAUWEISE = [
  329. ('Holz', 'Holz'),
  330. ('Beton', 'Beton'),
  331. ('Ziegel', 'Ziegel'),
  332. ('Mischbauweise', 'Mischbauweise'),
  333. ('Sonstiges', 'Sonstiges'),
  334. ]
  335. ZIELGRUPPEN = [
  336. ('Seniorinnen', 'Seniorinnen'),
  337. ('Alleinerziehende', 'Alleinerziehende'),
  338. ('Geflüchtete', 'Geflüchtete'),
  339. ('Sonstige', 'Sonstige'),
  340. ]
  341. GPROJEKTE = [
  342. ('Foodcoop', 'Foodcoop'),
  343. ('Carsharing', 'Carsharing'),
  344. ('Urban Gardening', 'Urban Gardening'),
  345. ('Sonstiges', 'Sonstiges'),
  346. ]
  347. FREIANGEBOT = [
  348. ('Dachterrasse', 'Dachterrasse'),
  349. ('Beete', 'Beete'),
  350. ('Kinderspielplatz', 'Kinderspielplatz'),
  351. ]
  352. @property
  353. def kind_of_product(self):
  354. return "Wohnprojekt"
  355. eigentum = CharField ( 'Rechtliche Konstruktion', max_length = 6, choices=EIGENTUM, default='GEMIET', help_text="Rechtliche Konstruktion", null = True, blank=True )
  356. inseratstext = CharField ( 'Inseratstext', max_length = 2048, help_text="Inseratstext", null = True, blank=True )
  357. altneu = CharField ( 'Altbau/Neubau', max_length = 4, choices=ALTNEU, help_text="Altbau/Neubau", null = True, blank=False )
  358. schwerpunkt = CharField ( 'Inhaltlicher Schwerpunkt', max_length = 2048, help_text="Inhaltlicher Schwerpunkt", null = True, blank=True )
  359. wohnbaufoerderung = CharField ( 'Wohnbauförderung', max_length = 4096, choices=WOHNBAUFOERDERUNG, help_text="Wohnbauförderung", null = True, blank=True )
  360. artmodell = CharField ( 'Art der Modells', max_length = 4096, choices=ARTMODELL, help_text="Art der Modells", null = True, blank=True )
  361. bautraeger = CharField ( 'Bauträger', max_length = 4096, choices=BAUTRAEGER, help_text="Bauträger", null = True, blank=True )
  362. aerwachsene = IntegerField( 'Anzahl an Erwachsenen', help_text="Anzahl an Erwachsenen", validators=[MinValueValidator(0), MaxValueValidator(9999)], null = True, blank=True )
  363. akinder = IntegerField( 'Anzahl an Kinder', help_text="Anzahl an Kinder", validators=[MinValueValidator(0), MaxValueValidator(9999)], null = True, blank=True )
  364. @property
  365. def amitglieder(self):
  366. return self.aerwachsene + self.akinder
  367. awohnungen = IntegerField( 'Anzahl an Wohnungen', help_text="Anzahl an Wohnungen", validators=[MinValueValidator(0), MaxValueValidator(9999)], null = True, blank=True )
  368. wohnflaeche = IntegerField( 'Wohnfläche', help_text="Wohnfläche", validators=[MinValueValidator(0)], default = 0, null = True, blank=True )
  369. gewerbeflaechen = IntegerField( 'Gewerbeflächen', help_text="Gewerbeflächen", validators=[MinValueValidator(0)], default = 0, null = True, blank=True )
  370. gemeinschaftsflaeche = IntegerField( 'Gemeinschaftsflächen', help_text="Gemeinschaftsflächen", validators=[MinValueValidator(0)], default = 0, null = True, blank=True )
  371. sonstige_flaechen = IntegerField( 'Sonstige Flächen', help_text="Sonstige Flächen", validators=[MinValueValidator(0)], default = 0, null = True, blank=True )
  372. @property
  373. def flaeche(self):
  374. return self.wohnflaeche + self.gewerbeflaechen + self.gemeinschaftsflaeche + self.sonstige_flaechen
  375. kflaechen = CharField ( 'Flächen - Kommentar', max_length = 4096, help_text="Flächen - Kommentar", null = True, blank=True )
  376. gemeinschaftr = MultiSelectField ( 'Gemeinschaftsräume', max_length = 4096, choices=GEMEINSCHAFTR, help_text="Gemeinschaftsräume", null = True, blank=True )
  377. kgemeinschaftr = CharField ( 'Gemeinschaftsräume - Sonstiges', max_length = 4096, help_text="Gemeinschaftsräume - Sonstiges", null = True, blank=True )
  378. sonderwohnformen = CharField ( 'Sonderwohnformen', max_length = 2048, help_text="Sonderwohnformen, z.B. Wohncluster, WGs, Sonstiges", null = True, blank=True )
  379. raumangebot = MultiSelectField ( 'Raumangebot nach Außen', max_length = 4096, choices=RAUMANGEBOT, help_text="Raumangebot nach Außen", null = True, blank=True )
  380. kraumangebot = CharField ( 'Raumangebot nach Außen - Sonstiges', max_length = 4096, help_text="Raumangebot nach Außen - Sonstiges", null = True, blank=True )
  381. 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 )
  382. karbeiten = CharField ( 'Wie viele Personen arbeiten im Haus - Kommentar', max_length = 2048, help_text="Kommentar", null = True, blank=True )
  383. bauweise = CharField ( 'Bauweise', max_length = 64, choices=BAUWEISE, help_text="Bauweise", null = True, blank=True )
  384. zielgruppen = CharField ( 'Besondere Zielgruppen', max_length = 64, choices=ZIELGRUPPEN, help_text="Besondere Zielgruppen", null = True, blank=True )
  385. gprojekte = CharField ( 'Gemeinschaftliche Projekte', max_length = 64, choices=GPROJEKTE, help_text="Gemeinschaftliche Projekte", null = True, blank=True )
  386. oekologie = CharField ( 'Ökologie', max_length = 2048, help_text="Ökologie", null = True, blank=True )
  387. freiraumangebote = CharField ( 'Freiraumangebote', max_length = 64, choices=FREIANGEBOT, help_text="Freiraumangebote", null = True, blank=False )
  388. gaestwohnungen = IntegerField ( 'Anzahl an Gästewohnungen', help_text="Anzahl an Gästewohnungen", validators=[MinValueValidator(0)], default = 0 )
  389. class Link(models.Model):
  390. product = ForeignKey(Product, on_delete=models.CASCADE)
  391. link_description = CharField(null=True, blank=True, max_length = 2048)
  392. link = URLField(null=True, blank=True, max_length = 2048)
  393. def product_path(instance, filename):
  394. return 'marktplatz/media/{0}/{1}'.format(instance.product.id, filename)
  395. class Media(models.Model):
  396. fs = FileSystemStorage(location=settings.MEDIA_ROOT)
  397. product = ForeignKey(Product, on_delete=models.CASCADE)
  398. name_for = CharField(blank = True,max_length = 256)
  399. filename = CharField(max_length = 100)
  400. copyright = CharField(blank=True, max_length = 100)
  401. image = ImageField(upload_to=product_path,storage=fs)
  402. image_small = ProcessedImageField(upload_to=product_path,
  403. processors=[ResizeToCover(640, 360)],
  404. format='JPEG',
  405. options={'quality': 90})
  406. image_medium= ProcessedImageField(upload_to=product_path,
  407. processors=[ResizeToCover(960, 540)],
  408. format='JPEG',
  409. options={'quality': 90})
  410. image_big = ProcessedImageField(upload_to=product_path,
  411. processors=[ResizeToCover(1920, 1080)],
  412. format='JPEG',
  413. options={'quality': 90})
  414. image_norm = ProcessedImageField(upload_to=product_path,
  415. processors=[Thumbnail(640, 360)],
  416. format='JPEG',
  417. options={'quality': 90},
  418. blank = True,
  419. null = True)
  420. def filename(self):
  421. return os.path.basename(self.image.name).split('.')[0]
  422. # These two auto-delete files from filesystem when they are unneeded:
  423. #
  424. @receiver(models.signals.post_delete, sender=Media)
  425. def auto_delete_file_on_delete(sender, instance, **kwargs):
  426. """
  427. Deletes file from filesystem
  428. when corresponding `MediaFile` object is deleted.
  429. """
  430. if instance.image:
  431. if os.path.isfile(instance.image.path):
  432. os.remove(instance.image.path)
  433. #
  434. if instance.image_small:
  435. if os.path.isfile(instance.image_small.path):
  436. os.remove(instance.image_small.path)
  437. #
  438. if instance.image_medium:
  439. if os.path.isfile(instance.image_medium.path):
  440. os.remove(instance.image_medium.path)
  441. #
  442. if instance.image_big:
  443. if os.path.isfile(instance.image_big.path):
  444. os.remove(instance.image_big.path)
  445. #
  446. if instance.image_norm:
  447. if os.path.isfile(instance.image_norm.path):
  448. os.remove(instance.image_norm.path)
  449. #
  450. #print(settings.MEDIA_ROOT+'/marktplatz/media/{0}/{1}'.format(instance.Product.id, instance.image.name))
  451. #print(instance.Product.id, instance.image.path)
  452. #os.remove(settings.MEDIA_ROOT+'/marktplatz/media/{0}/{1}_big'.format(instance.Product.id, instance.filename))
  453. #os.remove(settings.MEDIA_ROOT+'/marktplatz/media/{0}/{1}.jpg'.format(instance.Product.id, instance.image.name))
  454. #@receiver(models.signals.pre_save, sender=Media)
  455. #def auto_delete_file_on_change(sender, instance, **kwargs):
  456. # """
  457. # Deletes old file from filesystem
  458. # when corresponding `MediaFile` object is updated
  459. # with new file.
  460. # """
  461. # if not instance.pk:
  462. # return False
  463. #
  464. # try:
  465. # old_file = Media.objects.get(pk=instance.pk).image
  466. # except Media.DoesNotExist:
  467. # return False
  468. #
  469. # new_file = instance.image
  470. # if not old_file == new_file:
  471. # if os.path.isfile(old_file.path):
  472. # os.remove(old_file.path)
  473. #
  474. # try:
  475. # old_file = Media.objects.get(pk=instance.pk).image_small
  476. # except Media.DoesNotExist:
  477. # return False
  478. #
  479. # new_file = instance.image_small
  480. # if not old_file == new_file:
  481. # if os.path.isfile(old_file.path):
  482. # os.remove(old_file.path)
  483. #
  484. # try:
  485. # old_file = Media.objects.get(pk=instance.pk).image_medium
  486. # except Media.DoesNotExist:
  487. # return False
  488. #
  489. # new_file = instance.image_medium
  490. # if not old_file == new_file:
  491. # if os.path.isfile(old_file.path):
  492. # os.remove(old_file.path)
  493. #
  494. # try:
  495. # old_file = Media.objects.get(pk=instance.pk).image_big
  496. # except Media.DoesNotExist:
  497. # return False
  498. #
  499. # new_file = instance.image_big
  500. # if not old_file == new_file:
  501. # if os.path.isfile(old_file.path):
  502. # os.remove(old_file.path)
  503. #
  504. # try:
  505. # old_file = Media.objects.get(pk=instance.pk).image_norm
  506. # except Media.DoesNotExist:
  507. # return False
  508. #
  509. # new_file = instance.image_norm
  510. # if not old_file == new_file:
  511. # if os.path.isfile(old_file.path):
  512. # os.remove(old_file.path)
  513. #
  514. class Video(models.Model):
  515. product = ForeignKey(Product, on_delete=models.CASCADE)
  516. name_for = CharField(blank=True, max_length=256)
  517. filename = CharField(max_length=100)
  518. copyright = CharField(blank=True, max_length=100)
  519. image = FileField(upload_to=product_path)
  520. @receiver(models.signals.post_delete, sender=Video)
  521. def auto_delete_video_on_delete(sender, instance, **kwargs):
  522. """
  523. Deletes file from filesystem
  524. when corresponding `MediaFile` object is deleted.
  525. """
  526. if instance.image:
  527. if os.path.isfile(instance.image.path):
  528. os.remove(instance.image.path)
  529. #@receiver(models.signals.pre_save, sender=Video)
  530. #def auto_delete_video_on_change(sender, instance, **kwargs):
  531. # """
  532. # Deletes old file from filesystem
  533. # when corresponding `MediaFile` object is updated
  534. # with new file.
  535. # """
  536. # if not instance.pk:
  537. # return False
  538. #
  539. # try:
  540. # old_file = Video.objects.get(pk=instance.pk).image
  541. # except Media.DoesNotExist:
  542. # return False
  543. #
  544. # new_file = instance.image
  545. # if not old_file == new_file:
  546. # if os.path.isfile(old_file.path):
  547. # os.remove(old_file.path)
  548. class Vote(models.Model):
  549. product = ForeignKey(Product, on_delete=models.CASCADE)
  550. juryMember = ForeignKey(User, on_delete = models.CASCADE)
  551. vote = PositiveSmallIntegerField(default=0)
  552. comment = CharField(blank=True, max_length =300)
  553. def __iter__(self):
  554. for field in self._meta.fields:
  555. yield (field.verbose_name, field.value_to_string(self))