views.py 36 KB

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