views.py 39 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183
  1. import csv
  2. import json
  3. import copy
  4. import itertools
  5. from PIL import Image
  6. from PIL import Image
  7. from PIL import ImageFont
  8. from PIL import ImageDraw
  9. from django.contrib import messages
  10. from django.contrib.auth import login, authenticate
  11. from django.contrib.auth.models import User
  12. from django.contrib.auth.mixins import LoginRequiredMixin
  13. from django.contrib.auth.decorators import login_required
  14. from django.contrib.auth.models import User, Group
  15. from django.core import serializers
  16. from django.core.files import File
  17. from django.core.mail import send_mail
  18. from django.core.exceptions import PermissionDenied
  19. from django.urls import reverse, reverse_lazy
  20. from django.http import HttpResponseRedirect, Http404, HttpResponse
  21. from django.db import models
  22. from django.db.models import Count
  23. from django.views import generic, View
  24. from django.views.generic import TemplateView
  25. from django.views.generic import FormView
  26. from django.views.generic.edit import *
  27. from django.views.generic.detail import *
  28. from django.shortcuts import render, get_object_or_404, redirect, get_list_or_404, get_object_or_404
  29. from django.forms import formset_factory
  30. from django.forms import BaseModelFormSet
  31. from django.forms import modelformset_factory, inlineformset_factory
  32. from django.forms.models import model_to_dict
  33. # from django_countries import countries
  34. from django.template import Context, Template
  35. from django.conf import settings
  36. from django_file_form.uploader import FileFormUploader
  37. from constance import config
  38. from django.db.models import Q
  39. from newsletter.forms import *
  40. from newsletter.views import *
  41. from post_office import mail
  42. from .models import *
  43. from .forms import *
  44. from .utils import *
  45. # Create your views here.
  46. def index(request):
  47. context = {}
  48. return render(request, 'index.html', context = context)
  49. def about(request):
  50. context = {}
  51. context = {'generic_text': Template(config.ABOUT_CONTENT).render(Context(context))}
  52. return render(request, 'marktplatz/generic_text.html', context)
  53. def submit(request):
  54. context = {}
  55. context = {'generic_text': Template(config.SUBMIT_TEXT).render(Context(context))}
  56. return render(request,'marktplatz/generic_text.html', context)
  57. def error_404_view(request, exception):
  58. data = {"name": "Markplatz"}
  59. return render(request,'marktplatz/error_404.html', data)
  60. @login_required
  61. def home(request):
  62. user = request.user
  63. if user.groups.filter(name='submission').exists():
  64. return HttpResponseRedirect(reverse('meine-projekte'))
  65. else:
  66. return HttpResponseRedirect(reverse('products'))
  67. class SubscribeRequestView( SubscribeRequestView):
  68. form_class = NewsletterForm
  69. class AgentNewslwtterFormView(TemplateView):
  70. template_name = 'marktplatz/form_newsletter.html'
  71. embed = False
  72. def get_context_data(self, **kwargs):
  73. if self.embed :
  74. kwargs['embed'] = True
  75. kwargs['form_content'] = '<i class="fas fa-bell"></i> Suchagent einrichten'
  76. kwargs['content_a'] = 'Dein Suchagent wurde erstellt!'
  77. return super().get_context_data(**kwargs)
  78. def get(self, request, *args, **kwargs):
  79. context = self.get_context_data()
  80. context['form'] = AgentNewslwtterForm( )
  81. context['bz'] = request.GET.get('bz', '') # used in template to check a district by default.
  82. return render(request, self.template_name, context )
  83. class AgentNewsletterSubscribeView( SubscribeRequestView ):
  84. action = 'subscribe'
  85. # form_class = AgentNewslwtterForm
  86. confirm = False
  87. embed = False
  88. def get_context_data(self, **kwargs):
  89. if self.embed :
  90. kwargs['embed'] = True
  91. kwargs['form_content'] = '<i class="fas fa-bell"></i> Suchagent einrichten'
  92. kwargs['content_a'] = 'Dein Suchagent wurde erstellt!'
  93. # kwargs['news_form'] = SubscribeRequestForm()
  94. return super().get_context_data(**kwargs)
  95. def post(self, request, *args, **kwargs):
  96. data = request.POST.copy()
  97. data["email"] = data["email_field"]
  98. agent_form = AgentNewslwtterForm ( data )
  99. if agent_form.is_valid():
  100. agent_form.save()
  101. else:
  102. context = {}
  103. context['form_errors'] = agent_form.errors
  104. context['form'] = agent_form
  105. return render(request, 'marktplatz/form_newsletter.html', context )
  106. if agent_form.cleaned_data['subscribe'] :
  107. return super().post( request, *args, **kwargs )
  108. # return super(SubscribeRequestView, self).post( request, *args, **kwargs )
  109. context = {}
  110. context['content_a'] = '<br><i class="fas fa-bell"></i><br><h2>Dein Suchagent wurde erstellt!</h2>'
  111. return render(request, 'marktplatz/generic.html', context )
  112. # def dispatch(self, request, *args, **kwargs):
  113. #
  114. # return super(SubscribeRequestView, self).dispatch( request, *args, **kwargs )
  115. class genericView(TemplateView):
  116. template_name = 'marktplatz/generic.html'
  117. def get(self, request, *args, **kwargs):
  118. instance = get_object_or_404(Wohnprojekt, pk=2 )
  119. context = {}
  120. context['object'] = model_to_dict ( instance )
  121. context['object']['myfield'] = '----------------------------'
  122. return render(request, self.template_name, context )
  123. class pagesView(TemplateView):
  124. template_name = 'marktplatz/generic.html'
  125. def get(self, request, *args, **kwargs):
  126. context = {}
  127. context['content_a'] = ""
  128. context['content_b'] = config
  129. # print (config.items() )
  130. if 'page' in kwargs:
  131. context['content_a'] = kwargs['page']
  132. try:
  133. context['content_a'] = '<br><h2>' + kwargs['page'] + "</h2><br><br>"
  134. context['content_b'] = getattr(config , kwargs['page'], '')
  135. except KeyError:
  136. raise Http404
  137. # if config.get ( kwargs['page'] ) != None:
  138. # context['content_b'] = config.get ( kwargs['page'] )
  139. return render(request, self.template_name, context )
  140. class SearchAgentCreate(CreateView):
  141. model = SearchAgent
  142. template_name = 'marktplatz/form.html'
  143. fields = 'ort', 'email'
  144. success_url = reverse_lazy('generic')
  145. embed = False
  146. def get_context_data(self, **kwargs):
  147. if self.embed :
  148. kwargs['embed'] = True
  149. kwargs['form_content'] = '<i class="fas fa-bell"></i> Suchagent einrichten'
  150. kwargs['content_a'] = 'Dein Suchagent wurde erstellt!'
  151. # kwargs['news_form'] = SubscribeRequestForm()
  152. return super().get_context_data(**kwargs)
  153. def form_valid(self, form):
  154. super().form_valid(form)
  155. return render(self.request, 'marktplatz/generic.html',
  156. self.get_context_data(form=form))
  157. class SearchAgentDelete(DeleteView):
  158. model = SearchAgent
  159. template_name = 'marktplatz/form_delete.html'
  160. success_url = reverse_lazy('products')
  161. def get(self, request, *args, **kwargs):
  162. searchagent = get_object_or_404(SearchAgent, pk= kwargs.get('pk') )
  163. context = {}
  164. context['form_content'] = 'Dein Suchagent wurde gelöscht!'
  165. if searchagent.hash == kwargs.get('hash'):
  166. return super().get(self, request, *args, **kwargs)
  167. else:
  168. context['form_content'] = 'Oopala, das hat nicht geklappt.'
  169. return render(request, self.template_name, context )
  170. class ProductDelete(LoginRequiredMixin, DeleteView):
  171. model = Product
  172. template_name = 'marktplatz/product_delete.html'
  173. success_url = reverse_lazy('products')
  174. def get(self, request, *args, **kwargs):
  175. contact = get_object_or_404(Contact, user= self.request.user ) # Contact.objects.get(user=self.request.user)
  176. product = get_object_or_404(Product, pk= kwargs.get('pk') )
  177. if (contact.id == product.contact.id) :
  178. return super(ProductDelete, self).get(self, request, *args, **kwargs)
  179. else:
  180. raise Http404
  181. def post(self, request, *args, **kwargs):
  182. contact = get_object_or_404(Contact, user= self.request.user ) # Contact.objects.get(user=self.request.user)
  183. product = get_object_or_404(Product, pk= kwargs.get('pk') )
  184. if (contact.id == product.contact.id) :
  185. # context = {}
  186. # context['form_content'] = 'Dein Projekt wird gelöscht, wenn die Seite live ist!'
  187. # if settings.DEBUG:
  188. # return render(request, self.template_name, context )
  189. # else:
  190. return super().post(self, request, *args, **kwargs)
  191. else:
  192. raise Http404
  193. context = {}
  194. context['form_content'] = 'Oopala, das hat nicht geklappt.'
  195. return render(request, self.template_name, context )
  196. class ProductPublish(LoginRequiredMixin, DetailView):
  197. model = Product
  198. template_name = 'marktplatz/generic.html'
  199. # success_url = reverse_lazy('products')
  200. #
  201. def get(self, request, *args, **kwargs):
  202. contact = get_object_or_404(Contact, user= self.request.user ) # Contact.objects.get(user=self.request.user)
  203. product = get_object_or_404(Product, pk= kwargs.get('pk') )
  204. if (contact.id == product.contact.id) :
  205. product_url = reverse( 'product-detail', kwargs= { 'pk': product.pk } )
  206. publishmessage = "Ein Benutzer möchte folgendes Projekt freigeben: {}, {}".format( product.name, request.get_host() + product_url )
  207. userList =User.objects.filter( is_superuser = 1 )
  208. for superuser in userList:
  209. mail.send(
  210. superuser.email, # List of email addresses also accepted
  211. config.EMAIL_NOREPLY,
  212. subject='Projekt Freischaltung',
  213. headers={ 'Reply-To': superuser.email },
  214. message= publishmessage,
  215. # html_message='Hi <strong>there</strong>!',
  216. )
  217. context = {}
  218. context["content_a"] = '<br><br><br>Die Freigabe wurde beantragt.<br><br><br>'
  219. return render(request, self.template_name, context )
  220. else:
  221. raise Http404
  222. class ProductsView(generic.ListView):
  223. model = Product
  224. template_name = 'marktplatz/product_overview.html'
  225. context_object_name = 'object_list'
  226. def get_queryset(self):
  227. qs = super().get_queryset()
  228. user = self.request.user
  229. qs = qs.order_by('frei')
  230. if user.groups.filter(name='submission').exists():
  231. contact = Contact.objects.get(user=user)
  232. return qs.filter(contact = contact)
  233. if user.is_superuser:
  234. return qs
  235. qs = qs.filter(public = True)
  236. return qs
  237. def get_context_data(self, **kwargs):
  238. context = super().get_context_data(**kwargs)
  239. orts = {}
  240. for product in context['object_list']:
  241. if not product.ort in orts:
  242. orts[product.ort] = product.get_ort_display()
  243. context['ort_dict'] = orts
  244. context['user'] = self.request.user
  245. context['frei_list'] = Product.FREI
  246. context['status_list'] = Product.STATUS
  247. context['sponsor_cards'] = Template( config.SPONSOR_CARDS ).render( Context(context) )
  248. context['main_card'] = Template( config.MAIN_CARD ).render( Context(context) )
  249. context['type'] = 'BASE'
  250. context['textSearchForm'] = textSearchForm()
  251. return context
  252. class WohnprojekteView(ProductsView):
  253. model = Wohnprojekt
  254. template_name = 'marktplatz/product_overview.html'
  255. context_object_name = 'object_list'
  256. def get_context_data(self, **kwargs):
  257. context = super().get_context_data(**kwargs)
  258. raum_agebote = {}
  259. for product in context['object_list']:
  260. for raum in product.raumangebot:
  261. if not (raum in raum_agebote):
  262. raum_agebote[raum] = product.raumangebot.choices[raum]
  263. context['raum_agebote_dict'] = raum_agebote
  264. context['frei_list'][0] = ('JAJA', 'Platz frei')
  265. context['altneu_list'] = Wohnprojekt.ALTNEU
  266. context['type'] = 'WOHN'
  267. return context
  268. class MobilitaetsProjekteView(ProductsView):
  269. model = MobilitaetsProjekt
  270. template_name = 'marktplatz/product_overview.html'
  271. context_object_name = 'object_list'
  272. def get_context_data(self, **kwargs):
  273. context = super().get_context_data(**kwargs)
  274. context['type'] = 'MOBI'
  275. return context
  276. class ErnaerungsProjekteView(ProductsView):
  277. model = ErnaehrungsProjekt
  278. template_name = 'marktplatz/product_overview.html'
  279. context_object_name = 'object_list'
  280. def get_context_data(self, **kwargs):
  281. context = super().get_context_data(**kwargs)
  282. context['type'] = 'ERNA'
  283. return context
  284. class EnergyProjekteView(ProductsView):
  285. model = EnergyProjekt
  286. template_name = 'marktplatz/product_overview.html'
  287. context_object_name = 'object_list'
  288. def get_context_data(self, **kwargs):
  289. context = super().get_context_data(**kwargs)
  290. context['type'] = 'ENER'
  291. return context
  292. class FilterProductsView(ProductsView):
  293. def get_queryset(self, qfilter=None, **kwargs ):
  294. # original qs
  295. qs = super().get_queryset()
  296. if qfilter!=None:
  297. mfilter = {}
  298. mfilter[qfilter] = True
  299. qs = qs.filter ( **mfilter )
  300. qs = qs.order_by('frei')
  301. return qs.filter(public = True)
  302. def get(self, request, *args, **kwargs):
  303. qfilter = kwargs.get('filter', "")
  304. if qfilter != "":
  305. self.object_list = self.get_queryset(qfilter= qfilter )
  306. allow_empty = self.get_allow_empty()
  307. context = self.get_context_data()
  308. return self.render_to_response(context)
  309. class SearchProductsView(ProductsView):
  310. def get_queryset(self, qfilter=None, **kwargs ):
  311. # original qs
  312. qs = super().get_queryset()
  313. user = self.request.user
  314. if qfilter!=None:
  315. qs = qs.filter (name__icontains= qfilter) | \
  316. qs.filter (claim__icontains= qfilter) | \
  317. qs.filter (beschreibung__icontains= qfilter) | \
  318. qs.filter (learning__icontains= qfilter) | \
  319. qs.filter (status__icontains= qfilter) | \
  320. qs.filter (adresse__icontains= qfilter) | \
  321. qs.filter (plz__icontains= qfilter) | \
  322. qs.filter (adresse__icontains= qfilter) | \
  323. qs.filter (ort__icontains= qfilter) | \
  324. qs.filter (website__icontains= qfilter) | \
  325. qs.filter (email__icontains= qfilter) | \
  326. qs.filter (kfrei__icontains= qfilter) | \
  327. qs.filter (rechtsform__icontains= qfilter) | \
  328. qs.filter (orga__icontains= qfilter)
  329. # qs = qs.filter ( stringToSearch__icontains= qfilter )
  330. qs = qs.order_by('frei')
  331. return qs.filter(public = True)
  332. def post(self, request, *args, **kwargs):
  333. qform = textSearchForm( request.POST )
  334. if qform.is_valid():
  335. self.object_list = self.get_queryset(qfilter= qform.cleaned_data["searchText"] )
  336. allow_empty = self.get_allow_empty()
  337. if not allow_empty:
  338. # When pagination is enabled and object_list is a queryset,
  339. # it's better to do a cheap query than to load the unpaginated
  340. # queryset in memory.
  341. if self.get_paginate_by(self.object_list) is not None and hasattr(self.object_list, 'exists'):
  342. is_empty = not self.object_list.exists()
  343. else:
  344. is_empty = not self.object_list
  345. if is_empty:
  346. raise Http404(_("Empty list and '%(class_name)s.allow_empty' is False.") % {
  347. 'class_name': self.__class__.__name__,
  348. })
  349. context = self.get_context_data()
  350. context['type']= kwargs['type']
  351. return self.render_to_response(context)
  352. class SearchWohnProjectsView(SearchProductsView):
  353. model = Wohnprojekt
  354. form_class = WohnprojektForm
  355. def get_queryset(self, qfilter=None, **kwargs ):
  356. # original qs
  357. qs = super().get_queryset()
  358. user = self.request.user
  359. if qfilter!=None:
  360. qs = qs.filter (name__icontains= qfilter) | \
  361. qs.filter (claim__icontains= qfilter) | \
  362. qs.filter (beschreibung__icontains= qfilter) | \
  363. qs.filter (learning__icontains= qfilter) | \
  364. qs.filter (status__icontains= qfilter) | \
  365. qs.filter (adresse__icontains= qfilter) | \
  366. qs.filter (plz__icontains= qfilter) | \
  367. qs.filter (adresse__icontains= qfilter) | \
  368. qs.filter (ort__icontains= qfilter) | \
  369. qs.filter (website__icontains= qfilter) | \
  370. qs.filter (email__icontains= qfilter) | \
  371. qs.filter (kfrei__icontains= qfilter) | \
  372. qs.filter (rechtsform__icontains= qfilter) | \
  373. qs.filter (orga__icontains= qfilter) | \
  374. qs.filter (eigentum__icontains= qfilter) | \
  375. qs.filter (schwerpunkt__icontains= qfilter) | \
  376. qs.filter (artmodell__icontains= qfilter) | \
  377. qs.filter (bautraeger__icontains= qfilter) | \
  378. qs.filter (architektur__icontains= qfilter) | \
  379. qs.filter (kflaechen__icontains= qfilter) | \
  380. qs.filter (gemeinschaftr__icontains= qfilter) | \
  381. qs.filter (kgemeinschaftr__icontains= qfilter) | \
  382. qs.filter (raumangebot__icontains= qfilter) | \
  383. qs.filter (kraumangebot__icontains= qfilter) | \
  384. qs.filter (gewerbe__icontains= qfilter) | \
  385. qs.filter (inseratstext__icontains= qfilter) | \
  386. qs.filter (sonderwohnformen__icontains= qfilter) | \
  387. qs.filter (karbeiten__icontains= qfilter) | \
  388. qs.filter (bauweise__icontains= qfilter) | \
  389. qs.filter (zielgruppen__icontains= qfilter) | \
  390. qs.filter (gprojekte__icontains= qfilter) | \
  391. qs.filter (oekologie__icontains= qfilter) | \
  392. qs.filter (freiraumangebote__icontains= qfilter)
  393. # qs = qs.filter ( stringToSearch__icontains= qfilter )
  394. qs = qs.order_by('frei')
  395. return qs.filter(public = True)
  396. class GenericSearchView(SearchProductsView):
  397. def dispatch(self, request, *args, **kwargs):
  398. print( kwargs['type'] )
  399. if self.kwargs['type'] == 'BASE':
  400. return super().dispatch(request, *args, **kwargs)
  401. elif self.kwargs['type'] == 'WOHN':
  402. return SearchWohnProjectsView.as_view()(request, *args, **kwargs)
  403. elif self.kwargs['type'] == 'MOBI':
  404. self.model = MobilitaetsProjekt
  405. self.form_class = MobilitaetsForm
  406. return super().dispatch(request, *args, **kwargs)
  407. elif self.kwargs['type'] == 'ERNA':
  408. self.model = ErnaehrungsProjekt
  409. self.form_class = ErnaehrungsForm
  410. return super().dispatch(request, *args, **kwargs)
  411. elif self.kwargs['type'] == 'ENER':
  412. self.model = EnergyProjekt
  413. self.form_class = EnergyForm
  414. return super().dispatch(request, *args, **kwargs)
  415. class ProductsListView(generic.ListView):
  416. model = Product
  417. template_name='marktplatz/object_list.html'
  418. embed = False
  419. def get_queryset(self):
  420. # original qs
  421. qs = super().get_queryset()
  422. self.user = self.request.user
  423. user = self.user
  424. if user.is_superuser:
  425. return qs
  426. qs = qs.filter(public = True)
  427. return qs
  428. def get_context_data(self, **kwargs):
  429. if self.embed :
  430. kwargs['embed'] = True
  431. return super().get_context_data(**kwargs)
  432. #
  433. # DETAIL
  434. #
  435. class ProduktDetailView(generic.DetailView):
  436. model = Product
  437. template_name = 'marktplatz/product_detail.html'
  438. embed = False
  439. def get_context_data(self, **kwargs):
  440. if self.embed :
  441. kwargs['embed'] = True
  442. return super().get_context_data(**kwargs)
  443. def post(self, request, *args, **kwargs):
  444. # vote = int(request.POST['vote'])
  445. comment = str(request.POST['comment'])
  446. return HttpResponseRedirect( reverse('products') )
  447. class ProduktGenericDetailView(ProduktDetailView):
  448. def dispatch(self, request, *args, **kwargs):
  449. if self.kwargs['type'] == 'BASE':
  450. super().dispatch(request, *args, **kwargs)
  451. elif self.kwargs['type'] == 'WOHN':
  452. self.model = Wohnprojekt
  453. return super().dispatch(request, *args, **kwargs)
  454. elif self.kwargs['type'] == 'MOBI':
  455. self.model = MobilitaetsProjekt
  456. return super().dispatch(request, *args, **kwargs)
  457. elif self.kwargs['type'] == 'ERNA':
  458. self.model = ErnaehrungsProjekt
  459. return super().dispatch(request, *args, **kwargs)
  460. elif self.kwargs['type'] == 'ENER':
  461. self.model = EnergyProjekt
  462. return super().dispatch(request, *args, **kwargs)
  463. raise Http404('Keine Objekte gefunden')
  464. class WohnprojektDetailView(ProduktDetailView):
  465. model = Wohnprojekt
  466. template_name = 'marktplatz/product_detail.html'
  467. class MobilitaetsProjektDetailView(ProduktDetailView):
  468. model = MobilitaetsProjekt
  469. template_name = 'marktplatz/product_detail.html'
  470. class ErnaehrungsProjektDetailView(ProduktDetailView):
  471. model = ErnaehrungsProjekt
  472. template_name = 'marktplatz/product_detail.html'
  473. class EnergyProjektProjektDetailView(ProduktDetailView):
  474. model = EnergyProjekt
  475. template_name = 'marktplatz/product_detail.html'
  476. class ProduktCardDetailView(ProduktDetailView):
  477. template_name = 'marktplatz/product_detail_card.html'
  478. class ProductDispatchView(TemplateView):
  479. template_name = 'marktplatz/product_create_dispatch.html'
  480. class ProductCreateView(LoginRequiredMixin, CreateView):
  481. template_name = 'marktplatz/product_create.html'
  482. model = Product
  483. form_class = ProductForm
  484. gotoPics = False
  485. def get_context_data(self, **kwargs):
  486. context = super().get_context_data(**kwargs)
  487. context['info_txt'] = Template(config.INFO_TXT).render(Context(context))
  488. return context
  489. def post(self, request, *args, **kwargs):
  490. if 'add-image' in request.POST:
  491. self.gotoPics = True
  492. return super().post(self, request, *args, **kwargs)
  493. def form_valid(self, form):
  494. product = form.save(commit=False)
  495. product.contact = Contact.objects.get(user = self.request.user)
  496. product.save()
  497. if (self.gotoPics):
  498. return HttpResponseRedirect(reverse('add-image', kwargs={'pk': product.pk}))
  499. else:
  500. return HttpResponseRedirect( reverse('meine-projekte') )
  501. class ProductGenericCreateView(ProductCreateView):
  502. def dispatch(self, request, *args, **kwargs):
  503. if self.kwargs['type'] == 'BASE':
  504. super().dispatch(request, *args, **kwargs)
  505. elif self.kwargs['type'] == 'WOHN':
  506. self.model = Wohnprojekt
  507. self.form_class = WohnprojektForm
  508. return super().dispatch(request, *args, **kwargs)
  509. elif self.kwargs['type'] == 'MOBI':
  510. self.model = MobilitaetsProjekt
  511. self.form_class = MobilitaetsForm
  512. return super().dispatch(request, *args, **kwargs)
  513. elif self.kwargs['type'] == 'ERNA':
  514. self.model = ErnaehrungsProjekt
  515. self.form_class = ErnaehrungsForm
  516. return super().dispatch(request, *args, **kwargs)
  517. elif self.kwargs['type'] == 'ENER':
  518. self.model = EnergyProjekt
  519. self.form_class = EnergyForm
  520. return super().dispatch(request, *args, **kwargs)
  521. raise Http404('Keine Objekte gefunden' )
  522. class WohnProjektCreateView(ProductCreateView):
  523. model = Wohnprojekt
  524. form_class = WohnprojektForm
  525. class MobilitaetsProjektCreateView(ProductCreateView):
  526. model = MobilitaetsProjekt
  527. form_class = MobilitaetsForm
  528. class ErnaehrungsProjektCreateView(ProductCreateView):
  529. model = ErnaehrungsProjekt
  530. form_class = ErnaehrungsForm
  531. class EnergyProjektCreateView(ProductCreateView):
  532. model = EnergyProjekt
  533. form_class = EnergyForm
  534. class ProductUpdateView(LoginRequiredMixin, UpdateView):
  535. template_name = 'marktplatz/product_create.html'
  536. model = Product
  537. form_class = ProductForm
  538. gotoPics = False
  539. # success_url =
  540. def get_context_data(self, **kwargs):
  541. context = super().get_context_data(**kwargs)
  542. context['info_txt'] = Template(config.INFO_TXT).render(Context(context))
  543. return context
  544. def get_object(self, queryset=None):
  545. obj = super().get_object()
  546. if ( obj.user_can_manage(self.request.user) ):
  547. return obj
  548. raise PermissionDenied
  549. def post(self, request, *args, **kwargs):
  550. if 'add-image' in request.POST:
  551. self.gotoPics = True
  552. return super().post(self, request, *args, **kwargs)
  553. def get(self, request, *args, **kwargs):
  554. return super().get(self, request, *args, **kwargs)
  555. def form_valid(self, form):
  556. product = form.save(commit=False)
  557. product.contact = Contact.objects.get(user = self.request.user)
  558. product.save()
  559. if (self.gotoPics):
  560. return HttpResponseRedirect(reverse('add-image', kwargs={'pk': product.pk}))
  561. else:
  562. return HttpResponseRedirect( reverse('meine-projekte') )
  563. class ProductGenericUpdateView(ProductUpdateView):
  564. model = Product
  565. form_class = ProductForm
  566. def dispatch(self, request, *args, **kwargs):
  567. if self.kwargs['type'] == 'BASE':
  568. super().dispatch(request, *args, **kwargs)
  569. elif self.kwargs['type'] == 'WOHN':
  570. self.model = Wohnprojekt
  571. self.form_class = WohnprojektForm
  572. return super().dispatch(request, *args, **kwargs)
  573. elif self.kwargs['type'] == 'MOBI':
  574. self.model = MobilitaetsProjekt
  575. self.form_class = MobilitaetsForm
  576. return super().dispatch(request, *args, **kwargs)
  577. elif self.kwargs['type'] == 'ERNA':
  578. self.model = ErnaehrungsProjekt
  579. self.form_class = ErnaehrungsForm
  580. return super().dispatch(request, *args, **kwargs)
  581. elif self.kwargs['type'] == 'ENER':
  582. self.model = EnergyProjekt
  583. self.form_class = EnergyForm
  584. return super().dispatch(request, *args, **kwargs)
  585. raise Http404('Keine Objekte gefunden' )
  586. class WohnProjektUpdateView(ProductUpdateView):
  587. model = Wohnprojekt
  588. form_class = WohnprojektForm
  589. class MobilitaetsProjektUpdateView(ProductUpdateView):
  590. model = MobilitaetsProjekt
  591. form_class = MobilitaetsForm
  592. class ErnaehrungsProjektUpdateView(ProductUpdateView):
  593. model = ErnaehrungsProjekt
  594. form_class = ErnaehrungsForm
  595. class EnergyProjektUpdateView(ProductUpdateView):
  596. model = EnergyProjekt
  597. form_class = EnergyForm
  598. class UsersProducts(LoginRequiredMixin, generic.ListView):
  599. model = Product
  600. template_name='marktplatz/myProducts.html'
  601. def get_queryset(self):
  602. contact = Contact.objects.get(user=self.request.user)
  603. wohnprojekte = Wohnprojekt.objects.filter(contact=contact)
  604. mobilitaetsprojekte = MobilitaetsProjekt.objects.filter(contact=contact)
  605. ernaehrungsprojekte = ErnaehrungsProjekt.objects.filter(contact=contact)
  606. energyprojekte = EnergyProjekt.objects.filter(contact=contact)
  607. projekte = list(itertools.chain(wohnprojekte, mobilitaetsprojekte, ernaehrungsprojekte, energyprojekte))
  608. return projekte
  609. def get_context_data(self, **kwargs):
  610. context = super().get_context_data(**kwargs)
  611. contact = Contact.objects.get(user=self.request.user)
  612. context['user'] = self.request.user
  613. return context
  614. class AdminView(LoginRequiredMixin, generic.ListView):
  615. model = Product
  616. template_name='marktplatz/admin_panel.html'
  617. def get_context_data(self, **kwargs):
  618. context = super().get_context_data(**kwargs)
  619. return context
  620. def post(self, request, *args, **kwargs):
  621. # print (request.POST.dict())
  622. context = request.POST.dict()
  623. public = {k: v for k, v in context.items() if k.startswith('product_p')}
  624. for elemk in public:
  625. keys = elemk.split(".")
  626. current_product = Product.objects.get(pk=keys[1])
  627. if public[elemk] == 'true':
  628. if current_product.public == False :
  629. current_product.public = True
  630. current_product.save()
  631. else:
  632. current_product.public = False
  633. current_product.save()
  634. return HttpResponseRedirect('')
  635. class registerView(FormView):
  636. template_name = 'marktplatz/form.html'
  637. # form_class = RegisterForm
  638. def get(self, request):
  639. # form = self.form_class()
  640. context = request.GET.dict()
  641. context['form_content'] = '<p>Willkommen! Wir freuen uns, dass du bei uns mitmachen willst!</p> <p>Nach der Registrierung kannst du euer Projekt eintragen.</p> <p><br />Evtl. m&ouml;chtest du Kollegen die M&ouml;glichkeit geben auch zum Projekteintrag beizutragen. Wir haben nichts dagegen, dass du deine Logindaten mit Anderen aus deiner Projektgemeinschaft teilst. Dann k&ouml;nnen sie dir beim Eintragen helfen. Man kann Projekteintr&auml;ge &uuml;brigens auch zwischenspeichern, sodass ihr zeitversetzt daran arbeiten k&ouml;nnt. Wenn mehrere diesen Account teilen w&auml;hle dein Passwort mit Bedacht!</p>'
  642. context['form'] = RegisterForm
  643. context['signUp'] = SignUpForm
  644. return render(request, self.template_name, context)
  645. def post(self, request):
  646. # print ( request.POST.dict() )
  647. form = SignUpForm(request.POST)
  648. form_contact = RegisterForm(request.POST)
  649. #
  650. # Filter existing emails
  651. #
  652. qs = Contact.objects.filter( email=form_contact.data['email'] )
  653. if ( qs.count() ):
  654. form_contact.add_error('email', "Email already in use, please reset your password.")
  655. if form.is_valid() and form_contact.is_valid():
  656. # print (form.cleaned_data)
  657. # print (form_contact.cleaned_data)
  658. contact = form_contact.save(commit=False)
  659. user = form.save()
  660. user.email = contact.email
  661. user.first_name = contact.first_name
  662. user.last_name = contact.last_name
  663. user.set_password(form.cleaned_data.get('password1'))
  664. user.save()
  665. contact.user = user
  666. contact.save()
  667. username = form.cleaned_data.get('username')
  668. raw_password = form.cleaned_data.get('password1')
  669. group = Group.objects.get(name='submission')
  670. group.user_set.add(user)
  671. user = authenticate(username=username, password=raw_password)
  672. if user is not None:
  673. # A backend authenticated the credentials
  674. login(request, user)
  675. return redirect('products')
  676. else:
  677. # No backend authenticated the credentials
  678. send_mail(
  679. 'error with auth',
  680. 'Error in authorization.' + json.dumps( request.POST.dict() ),
  681. 'awards@berta.mediaarchitecture.org',
  682. ['juan@mediaarchitecture.org'],
  683. fail_silently=False,
  684. )
  685. return redirect('products')
  686. login(request, user)
  687. else:
  688. # print (form.errors)
  689. # print (form_contact.errors)
  690. send_mail(
  691. 'error with auth',
  692. 'Error in forms. \n\n form.errors: \n\n' + json.dumps(form.errors) + '\n\n form_contact.errors: \n\n' + json.dumps(form_contact.errors),
  693. 'awards@berta.mediaarchitecture.org',
  694. ['juan@mediaarchitecture.org'],
  695. fail_silently=False,
  696. )
  697. context = request.POST.dict()
  698. context['signUp'] = form
  699. context['form'] = form_contact
  700. context['signup_errors'] = form.errors
  701. context['contact_errors'] = form_contact.errors
  702. return render(request, self.template_name, context)
  703. context = request.GET.dict()
  704. context['form'] = RegisterForm
  705. context['signUp'] = SignUpForm
  706. return render(request, self.template_name, context)
  707. class lightboximg(LoginRequiredMixin, TemplateView):
  708. template_name = "marktplatz/importold.html"
  709. def post(self, request):
  710. context = {'faild': ''}
  711. faild = ''
  712. from1 = int(request.POST['from'])
  713. to = int(request.POST['to'])
  714. products = Product.objects.all()
  715. i = 0
  716. for product in products:
  717. i+=1
  718. if (i < from1):
  719. continue
  720. if (i > to):
  721. break
  722. medias = product.media_set.all()
  723. for oldmedia in medias:
  724. if not oldmedia.image_norm:
  725. oldpic = oldmedia.image
  726. oldmedia.image_norm.save(oldmedia.filename() + '_norm', oldpic)
  727. oldmedia.save
  728. return render(request, self.template_name, context)
  729. def get(self, request):
  730. context = {'faild': ''}
  731. faild = ''
  732. context['faild'] = faild
  733. return render(request, self.template_name, context)
  734. class addImageView(LoginRequiredMixin, FormView):
  735. use_ajax = True
  736. template_name = 'marktplatz/file_upload.html'
  737. def get(self, request, pk):
  738. user = self.request.user
  739. contact = Contact.objects.get(user=user)
  740. # print (contact.id)
  741. product = Product.objects.filter(contact=contact)
  742. if not Product.objects.filter(contact=contact).filter(pk=pk).exists():
  743. # print( "no product 1" )
  744. raise Http404
  745. product = Product.objects.get(pk=pk)
  746. photo = product.media_set.count()
  747. video = product.video_set.count()
  748. context = request.GET.dict()
  749. contact = Contact.objects.get(user=self.request.user)
  750. # print( "before 404" )
  751. product = get_object_or_404(Product, (Q(pk=pk) & Q(contact=contact)))
  752. context['product'] = product
  753. context['images'] = Media.objects.filter(product=product)
  754. context['video'] = Video.objects.filter(product=product)
  755. context['media'] = MediaForm
  756. context['media_count'] = False
  757. context['video_count'] = False
  758. if photo >= 7:
  759. context['media_count'] = True
  760. if video >= 2:
  761. context['video_count'] = True
  762. # context['use_ajax'] = True
  763. context['warning'] = False
  764. return render(request, self.template_name, context)
  765. def post(self, request, pk):
  766. vid1_f = MediaForm(request.POST, request.FILES)
  767. product = Product.objects.get(pk=pk)
  768. i = product.media_set.count()
  769. i += product.video_set.count()
  770. video = product.video_set.count()
  771. photo = product.media_set.count()
  772. context = request.GET.dict()
  773. contact = Contact.objects.get(user=self.request.user)
  774. product = get_object_or_404(Product, (Q(pk=pk) & Q(contact=contact)))
  775. context['product'] = product
  776. context['images'] = Media.objects.filter(product=product)
  777. context['video'] = Video.objects.filter(product=product)
  778. context['media'] = MediaForm
  779. context['media_count'] = False
  780. context['video_count'] = False
  781. context['use_ajax'] = True
  782. context['warning'] = False
  783. if vid1_f.is_valid():
  784. image = vid1_f.cleaned_data['image']
  785. name = image.name
  786. if 'png' in name or 'jpg' in name or 'jpeg' in name:
  787. if photo < 7:
  788. vid1 = Media()
  789. vid1.product = product
  790. vid1.filename = name
  791. vid1.copyright = vid1_f.cleaned_data['copyright']
  792. vid1.name_for = vid1_f.cleaned_data['name_for']
  793. vid1.image.save(name, image)
  794. vid1.image_small.save(str(i) + '_small', image)
  795. vid1.image_medium.save(str(i) + '_medium', image)
  796. vid1.image_big.save(str(i) + '_big', image)
  797. vid1.image_norm.save(str(i) + '_norm', image)
  798. vid1.save
  799. photo += 1
  800. else:
  801. context['warning'] = "You can not upload any more photos!"
  802. elif 'mp4' in name or 'm3u8' in name or 'm4v' in name:
  803. if video < 2:
  804. #TODO clean image here!
  805. vid1 = Video()
  806. vid1.product = product
  807. vid1.filename = name
  808. vid1.copyright = vid1_f.cleaned_data['copyright']
  809. vid1.name_for = vid1_f.cleaned_data['name_for']
  810. vid1.image.save(name, image)
  811. vid1.save
  812. video += 1
  813. else:
  814. context['warning'] = "You can not upload any more videos!"
  815. vid1_f.delete_temporary_files()
  816. if photo >= 7:
  817. context['media_count'] = True
  818. if video >= 2:
  819. context['video_count'] = True
  820. return render(request, self.template_name, context)
  821. handle_upload = FileFormUploader()
  822. class MediaView(LoginRequiredMixin, TemplateView):
  823. template_name = 'marktplatz/media_overview.html'
  824. def get(self, request, pk):
  825. self.user = self.request.user
  826. user= self.user
  827. contact = Contact.objects.get(user=user)
  828. if not Product.objects.filter(contact=contact).filter(pk=pk).exists():
  829. raise Http404
  830. context = request.GET.dict()
  831. contact = Contact.objects.get(user=self.request.user)
  832. product = get_object_or_404(Product, (Q(pk = pk) & Q(contact = contact)))
  833. context['product'] = product
  834. context['media'] = Media.objects.filter(product=product)
  835. context['video'] = Video.objects.filter(product=product)
  836. return render(request, self.template_name, context)
  837. def delete_media(request, pk):
  838. user = request.user
  839. contact = Contact.objects.get(user=user)
  840. object = Media.objects.get(id=pk)
  841. if not Product.objects.filter(contact=contact).filter(pk=object.product.pk).exists():
  842. raise Http404
  843. object.delete()
  844. return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/'))
  845. def delete_video(request, pk):
  846. user = request.user
  847. contact = Contact.objects.get(user=user)
  848. object = Video.objects.get(id=pk)
  849. if not Product.objects.filter(contact=contact).filter(pk=object.product.pk).exists():
  850. raise Http404
  851. object.delete()
  852. return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/'))