views.py 40 KB

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