models.py 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429
  1. from django.db import models
  2. from django.contrib.auth.models import User
  3. from imagekit.models import ImageSpecField
  4. from imagekit.processors import ResizeToFill
  5. from imagekit.processors import ResizeToCover
  6. from imagekit.processors import Thumbnail
  7. from imagekit.processors import ResizeToCover
  8. from imagekit.models import ProcessedImageField
  9. from django.core.files.storage import FileSystemStorage
  10. from django_countries.fields import CountryField
  11. import os
  12. import uuid
  13. from django.db import models
  14. from django.dispatch import receiver
  15. from django.db.models.signals import post_delete, post_save
  16. from django.conf import settings
  17. import datetime
  18. import shutil
  19. class Credit(models.Model):
  20. owner = models.CharField(verbose_name='Building or Product owner',blank=True,max_length = 300)
  21. architecture = models.CharField(verbose_name='Architecture',blank=True,max_length = 300)
  22. concept = models.CharField(verbose_name='Product artist/ concept/ design/ planning',blank=True,max_length = 300)
  23. structural_engeneering = models.CharField(verbose_name='Structural engineering',blank=True,max_length = 300)
  24. facade_design = models.CharField(verbose_name='Facade design',blank=True,max_length = 300)
  25. face_construction = models.CharField(verbose_name='Facade construction',blank=True,max_length = 300)
  26. kinetic_design = models.CharField(verbose_name='Kinetic engineering',blank = True,max_length = 300)
  27. light_design = models.CharField(verbose_name='Light design',blank = True,max_length = 300)
  28. tecnical_layout = models.CharField(verbose_name='Technical layout light',blank = True,max_length = 300)
  29. display_content = models.CharField(verbose_name='Display content/ visuals/ showreel',blank = True,max_length = 300)
  30. light_hardware = models.CharField(verbose_name='Light hardware (LED hardware)',blank = True,max_length = 300)
  31. lightning_software = models.CharField(verbose_name='Lighting control software',blank = True,max_length = 300)
  32. Product_coordination = models.CharField(verbose_name='Product co-ordination',blank = True,max_length = 300)
  33. membrane_skin = models.CharField(verbose_name='Membrane skin',blank = True,max_length = 300)
  34. interaction_design = models.CharField(verbose_name='Interaction design/ programming',blank = True,max_length = 300)
  35. sponsor = models.CharField(verbose_name='Product sponsor/ support',blank = True,max_length = 500)
  36. module_elems = models.CharField(verbose_name='Pixel or other basic module/ elements',blank = True,max_length = 300)
  37. def __iter__(self):
  38. for field in self._meta.fields:
  39. if field.value_to_string(self) is not '-' and field.value_to_string(self) is not 'N/A':
  40. yield (field.verbose_name, field.value_to_string(self))
  41. class Description(models.Model):
  42. facade = models.TextField(verbose_name='Facade type and geometry (structure)',blank = True,max_length = 900)
  43. light_creation = models.TextField(verbose_name='Kind of light creation',blank = True,max_length = 900)
  44. resolution = models.TextField(verbose_name='Resolution and transmitting behaviour',blank = True,max_length = 900)
  45. pixel_distance = models.CharField(verbose_name='Pixel distance',blank = True,max_length = 300)
  46. luminance = models.TextField(verbose_name='Luminace',blank = True,max_length = 900)
  47. urban_situation = models.TextField(verbose_name='Urban situation',blank = True,max_length = 900)
  48. description_showreel = models.TextField(verbose_name='Description of showreel',blank = True,max_length = 900)
  49. def __iter__(self):
  50. for field in self._meta.fields:
  51. if (field.value_to_string(self) is not '-') and (field.value_to_string(self) is not 'N/A'):
  52. yield (field.verbose_name, field.value_to_string(self))
  53. class Interaction(models.Model):
  54. communtity = models.TextField(verbose_name='Community or communities involved',blank = True,max_length = 900)
  55. host = models.CharField(verbose_name='Host organization',blank = True,max_length = 900)
  56. legal_form = models.CharField(verbose_name='Legal form',blank=True,max_length = 900)
  57. issues = models.TextField(verbose_name='Issues addressed',blank = True,max_length = 900)
  58. impact = models.TextField(verbose_name='Impact',blank = True,max_length = 900)
  59. tools = models.TextField(verbose_name='Tools developed',blank = True,max_length = 900)
  60. tools_used = models.TextField(verbose_name='Tools used',blank = True,max_length = 900)
  61. next_steps = models.TextField(verbose_name='Next steps',blank = True,max_length = 900)
  62. def __iter__(self):
  63. for field in self._meta.fields:
  64. if (field.value_to_string(self) is not '-') and (field.value_to_string(self) is not 'N/A'):
  65. yield (field.verbose_name, field.value_to_string(self))
  66. class Contact(models.Model):
  67. user = models.OneToOneField(User, on_delete=models.CASCADE,blank=True)
  68. first_name = models.CharField(verbose_name="Vorname", max_length = 100)
  69. last_name = models.CharField(verbose_name="Nachname", max_length = 100)
  70. adress = models.CharField(verbose_name="Adresse", blank=True,max_length = 100)
  71. postcode = models.CharField(verbose_name="Postleitzahl", blank=True, max_length = 100)
  72. city = models.CharField(verbose_name="Stadt", blank=True,max_length = 100)
  73. country = models.CharField(verbose_name="Land", blank=True,max_length = 100)
  74. email = models.EmailField(verbose_name="E-Mail-Addresse", unique=True)
  75. phonenumber = models.CharField(verbose_name="Telefonnummer", blank=True,max_length = 100)
  76. alternate_phonenumber = models.CharField(verbose_name="Telefonnummer", blank = True,max_length = 100)
  77. skype_name = models.CharField(verbose_name="Skype", blank=True,max_length = 300)
  78. website = models.URLField(verbose_name="Website", blank=True)
  79. def __str__(self):
  80. return self.first_name + ' ' + self.last_name
  81. def __iter__(self):
  82. for field in self._meta.fields:
  83. yield (field.verbose_name, field.value_to_string(self))
  84. class Category(models.Model):
  85. name = models.CharField(max_length=100)
  86. short_name = models.CharField(max_length=10)
  87. def __str__(self):
  88. return self.name
  89. class Product(models.Model):
  90. STATUS = [
  91. ('ENT', 'Entwicklung'),
  92. ('BET', 'In Betrieb'),
  93. ('ABG', 'Abgeschlossen'),
  94. ]
  95. FREI = [
  96. ('JAJA', 'Ja, bitte melden'),
  97. ('WART', 'Nein, aber es gibt eine Warteliste'),
  98. ('NEIN', 'Nein und es gibt keine Warteliste'),
  99. ]
  100. RECHTSFORM = [
  101. ('GMBH', 'GmbH'),
  102. ('VERE', 'Verein'),
  103. ('ANDE', 'Adere'),
  104. ]
  105. ORT = [
  106. ('1010', '1., Innere Stadt'),
  107. ('1020', '2., Leopoldstadt'),
  108. ('1030', '3., Landstraße'),
  109. ('1040', '4., Wieden'),
  110. ('1050', '5., Margareten'),
  111. ('1060', '6., Mariahilf'),
  112. ('1070', '7., Neubau'),
  113. ('1080', '8., Josefstadt'),
  114. ('1090', '9., Alsergrund'),
  115. ('1100', '10., Favoriten'),
  116. ('1110', '11., Simmering'),
  117. ('1120', '12., Meidling'),
  118. ('1130', '13., Hietzing'),
  119. ('1140', '14., Penzing'),
  120. ('1150', '15., Rudolfsheim-Fünfhaus'),
  121. ('1160', '16., Ottakring'),
  122. ('1170', '17., Hernals'),
  123. ('1180', '18., Währing'),
  124. ('1190', '19., Döbling'),
  125. ('1200', '20., Brigittenau'),
  126. ('1210', '21., Floridsdorf'),
  127. ('1220', '22., Donaustadt'),
  128. ('1230', '23., Liesing'),
  129. ('GERM', 'Deutschland'),
  130. ('SCHW', 'Schweiz'),
  131. ('GERM', 'Germany'),
  132. ('GERM', 'Germany'),
  133. ('VORA', 'Vorarlberg'),
  134. ('TIRO', 'Tirol'),
  135. ('SALZ', 'Salzburg'),
  136. ('KAER', 'Kärnten'),
  137. ('STEI', 'Steiermark'),
  138. ('OBER', 'Oberösterreich'),
  139. ('NIER', 'Niederösterreich'),
  140. ('BURG', 'Burgenland'),
  141. ('WELT', 'Welt'),
  142. ]
  143. ORGANIZATION = [
  144. ('SOZ', 'Soziokratie'),
  145. ('SON', 'Sonstiges'),
  146. ]
  147. name = models.CharField( 'Name', max_length = 128, help_text="Name des Projekts", null = True, blank=True )
  148. claim = models.CharField( 'Claim / Untertitel', max_length = 256, help_text="Untertitel", null = True, blank=True )
  149. beschreibung = models.CharField( 'Claim / Untertitel', max_length = 256, help_text="", null = True, blank=True )
  150. learning = models.CharField( 'Learning', max_length = 256, help_text="Learning", null = True, blank=True )
  151. gruendungsjahr = models.CharField('Gründungsjahr', max_length = 256, help_text="Gründungsjahr des Projekts", null = True, blank=True )
  152. betriebgenommen = models.DateField('in Betrieb genommen in Jahr', max_length = 256, help_text="Wann wurde das Projekt in Betrieb genommen?" , null = True, blank=True )
  153. status = models.CharField( 'Status', max_length = 3, choices=STATUS, default='ENT', help_text="Was ist der Status des Projektes" , null = True, blank=True )
  154. adresse = models.CharField( 'Adresse', max_length = 256, help_text="Adresse des Projektes", null = True, blank=True )
  155. website = models.URLField ( 'Website', max_length = 2048, help_text="Website des des Projektes", null = True, blank=True )
  156. frei = models.CharField( 'Platz frei', max_length = 4, choices=FREI, default='NEIN', help_text="Gibt es freie Plätze?", null = True, blank=True )
  157. mitmachen = models.BooleanField( 'Mitmachen möglich', default=False, help_text="Kann jemand mitmachen?", null = True, blank=True )
  158. rechtsform = models.CharField( 'Rechtsform', max_length = 4, choices=RECHTSFORM, default='ANDE', help_text="Rechtsform des Projektes", null = True, blank=True )
  159. ort = models.CharField( 'Ort', max_length = 4, choices=ORT, default='WELT', help_text="Ort des Projektes", null = True, blank=True )
  160. orga = models.CharField( 'Organisationsform', max_length = 3, choices=ORGANIZATION, default='SON', help_text="Organisationsform des Projektes", null = True, blank=True )
  161. title = models.CharField('Product Title',max_length = 100)
  162. country = CountryField(blank=True,multiple=True, help_text="")
  163. city = models.CharField(max_length = 100,null = True, blank=True, help_text="")
  164. year = models.IntegerField('Year of Completion',null = True, blank=True, help_text="")
  165. owner = models.CharField(max_length = 300,null = True,blank=True, help_text="")
  166. teaser_txt = models.TextField(blank = True, max_length = 1050, help_text="")
  167. header = models.CharField(max_length = 900,null = True, help_text="")
  168. description_txt = models.TextField(max_length = 3000,null = True, help_text="")
  169. cid = models.IntegerField(null = True,blank=True, help_text="")
  170. class_cid = models.CharField(null = True,max_length = 3, blank=True, help_text="")
  171. sumbitted = models.CharField(null = True,max_length = 10, blank=True, help_text="")
  172. date_submitted = models.DateField(auto_now_add=True, help_text="")
  173. terms = models.NullBooleanField(help_text="")
  174. edit = models.NullBooleanField(help_text="")
  175. public = models.NullBooleanField(help_text="")
  176. photo = models.CharField(max_length=500, null=True, blank=True, help_text="")
  177. videocts = models.CharField(max_length=500, null=True, blank=True, help_text="")
  178. category = models.ManyToManyField(Category, null=True, help_text="")
  179. credits = models.ForeignKey(Credit, null = True,on_delete=models.SET_NULL, help_text="")
  180. description = models.ForeignKey(Description,null = True, on_delete=models.SET_NULL, help_text="")
  181. contact = models.ForeignKey(Contact, null = True,on_delete=models.SET_NULL, help_text="")
  182. interaction = models.ForeignKey(Interaction, null = True,on_delete = models.SET_NULL, help_text="")
  183. def __str__(self):
  184. return str(self.title)
  185. def __iter__(self):
  186. for field in self._meta.fields:
  187. yield (field.verbose_name, field.value_to_string(self))
  188. class BuildingProduct(Product):
  189. additionalInfo = models.CharField('Product Title',max_length = 100)
  190. @receiver(post_delete, sender=Product)
  191. def auto_delete_reverse_keys(sender, instance, **kwargs):
  192. if instance.credits:
  193. instance.credits.delete()
  194. if instance.description:
  195. instance.description.delete()
  196. if instance.interaction:
  197. instance.interaction.delete()
  198. class Link(models.Model):
  199. Product = models.ForeignKey(Product, on_delete=models.CASCADE)
  200. link_description = models.CharField(null=True, blank=True, max_length = 2048)
  201. link = models.URLField(null=True, blank=True, max_length = 2048)
  202. def Product_path(instance, filename):
  203. return 'marktplatz/media/{0}/{1}'.format(instance.Product.id, filename)
  204. class Media(models.Model):
  205. fs = FileSystemStorage(location=settings.MEDIA_ROOT)
  206. Product = models.ForeignKey(Product, on_delete=models.CASCADE)
  207. name_for = models.CharField(blank = True,max_length = 256)
  208. filename = models.CharField(max_length = 100)
  209. copyright = models.CharField(blank=True, max_length = 100)
  210. image = models.ImageField(upload_to=Product_path,storage=fs)
  211. image_small = ProcessedImageField(upload_to=Product_path,
  212. processors=[ResizeToCover(640, 360)],
  213. format='JPEG',
  214. options={'quality': 90})
  215. image_medium= ProcessedImageField(upload_to=Product_path,
  216. processors=[ResizeToCover(960, 540)],
  217. format='JPEG',
  218. options={'quality': 90})
  219. image_big = ProcessedImageField(upload_to=Product_path,
  220. processors=[ResizeToCover(1920, 1080)],
  221. format='JPEG',
  222. options={'quality': 90})
  223. image_norm = ProcessedImageField(upload_to=Product_path,
  224. processors=[Thumbnail(640, 360)],
  225. format='JPEG',
  226. options={'quality': 90},
  227. blank = True,
  228. null = True)
  229. def filename(self):
  230. return os.path.basename(self.image.name).split('.')[0]
  231. # These two auto-delete files from filesystem when they are unneeded:
  232. #
  233. @receiver(models.signals.post_delete, sender=Media)
  234. def auto_delete_file_on_delete(sender, instance, **kwargs):
  235. """
  236. Deletes file from filesystem
  237. when corresponding `MediaFile` object is deleted.
  238. """
  239. if instance.image:
  240. if os.path.isfile(instance.image.path):
  241. os.remove(instance.image.path)
  242. #
  243. if instance.image_small:
  244. if os.path.isfile(instance.image_small.path):
  245. os.remove(instance.image_small.path)
  246. #
  247. if instance.image_medium:
  248. if os.path.isfile(instance.image_medium.path):
  249. os.remove(instance.image_medium.path)
  250. #
  251. if instance.image_big:
  252. if os.path.isfile(instance.image_big.path):
  253. os.remove(instance.image_big.path)
  254. #
  255. if instance.image_norm:
  256. if os.path.isfile(instance.image_norm.path):
  257. os.remove(instance.image_norm.path)
  258. #
  259. #print(settings.MEDIA_ROOT+'/marktplatz/media/{0}/{1}'.format(instance.Product.id, instance.image.name))
  260. #print(instance.Product.id, instance.image.path)
  261. #os.remove(settings.MEDIA_ROOT+'/marktplatz/media/{0}/{1}_big'.format(instance.Product.id, instance.filename))
  262. #os.remove(settings.MEDIA_ROOT+'/marktplatz/media/{0}/{1}.jpg'.format(instance.Product.id, instance.image.name))
  263. #@receiver(models.signals.pre_save, sender=Media)
  264. #def auto_delete_file_on_change(sender, instance, **kwargs):
  265. # """
  266. # Deletes old file from filesystem
  267. # when corresponding `MediaFile` object is updated
  268. # with new file.
  269. # """
  270. # if not instance.pk:
  271. # return False
  272. #
  273. # try:
  274. # old_file = Media.objects.get(pk=instance.pk).image
  275. # except Media.DoesNotExist:
  276. # return False
  277. #
  278. # new_file = instance.image
  279. # if not old_file == new_file:
  280. # if os.path.isfile(old_file.path):
  281. # os.remove(old_file.path)
  282. #
  283. # try:
  284. # old_file = Media.objects.get(pk=instance.pk).image_small
  285. # except Media.DoesNotExist:
  286. # return False
  287. #
  288. # new_file = instance.image_small
  289. # if not old_file == new_file:
  290. # if os.path.isfile(old_file.path):
  291. # os.remove(old_file.path)
  292. #
  293. # try:
  294. # old_file = Media.objects.get(pk=instance.pk).image_medium
  295. # except Media.DoesNotExist:
  296. # return False
  297. #
  298. # new_file = instance.image_medium
  299. # if not old_file == new_file:
  300. # if os.path.isfile(old_file.path):
  301. # os.remove(old_file.path)
  302. #
  303. # try:
  304. # old_file = Media.objects.get(pk=instance.pk).image_big
  305. # except Media.DoesNotExist:
  306. # return False
  307. #
  308. # new_file = instance.image_big
  309. # if not old_file == new_file:
  310. # if os.path.isfile(old_file.path):
  311. # os.remove(old_file.path)
  312. #
  313. # try:
  314. # old_file = Media.objects.get(pk=instance.pk).image_norm
  315. # except Media.DoesNotExist:
  316. # return False
  317. #
  318. # new_file = instance.image_norm
  319. # if not old_file == new_file:
  320. # if os.path.isfile(old_file.path):
  321. # os.remove(old_file.path)
  322. #
  323. class Video(models.Model):
  324. Product = models.ForeignKey(Product, on_delete=models.CASCADE)
  325. name_for = models.CharField(blank=True, max_length=256)
  326. filename = models.CharField(max_length=100)
  327. copyright = models.CharField(blank=True, max_length=100)
  328. image = models.FileField(upload_to=Product_path)
  329. @receiver(models.signals.post_delete, sender=Video)
  330. def auto_delete_video_on_delete(sender, instance, **kwargs):
  331. """
  332. Deletes file from filesystem
  333. when corresponding `MediaFile` object is deleted.
  334. """
  335. if instance.image:
  336. if os.path.isfile(instance.image.path):
  337. os.remove(instance.image.path)
  338. #@receiver(models.signals.pre_save, sender=Video)
  339. #def auto_delete_video_on_change(sender, instance, **kwargs):
  340. # """
  341. # Deletes old file from filesystem
  342. # when corresponding `MediaFile` object is updated
  343. # with new file.
  344. # """
  345. # if not instance.pk:
  346. # return False
  347. #
  348. # try:
  349. # old_file = Video.objects.get(pk=instance.pk).image
  350. # except Media.DoesNotExist:
  351. # return False
  352. #
  353. # new_file = instance.image
  354. # if not old_file == new_file:
  355. # if os.path.isfile(old_file.path):
  356. # os.remove(old_file.path)
  357. class Vote(models.Model):
  358. Product = models.ForeignKey(Product, on_delete=models.CASCADE)
  359. juryMember = models.ForeignKey(User, on_delete = models.CASCADE)
  360. vote = models.PositiveSmallIntegerField(default=0)
  361. comment = models.CharField(blank=True, max_length =300)
  362. def __iter__(self):
  363. for field in self._meta.fields:
  364. yield (field.verbose_name, field.value_to_string(self))