views.py 35 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070
  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 = {'about_text': Template(config.ABOUT_CONTENT).render(Context(context))}
  52. return render(request, 'marktplatz/about.html', context)
  53. def submit(request):
  54. context = {}
  55. context = {'submit_text': Template(config.SUBMIT_TEXT).render(Context(context))}
  56. return render(request,'marktplatz/submit.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. self.user = self.request.user
  230. user = self.user
  231. qs = qs.order_by('frei')
  232. if user.groups.filter(name='submission').exists():
  233. contact = Contact.objects.get(user=user)
  234. return qs.filter(contact = contact)
  235. if user.is_superuser:
  236. return qs
  237. qs = qs.filter(public = True)
  238. return qs
  239. def get_context_data(self, **kwargs):
  240. context = super().get_context_data(**kwargs)
  241. user =self.request.user
  242. context['user'] = user
  243. context['textSearchForm'] = textSearchForm()
  244. context['sponsor_cards'] = Template( config.SPONSOR_CARDS ).render( Context(context) )
  245. context['main_card'] = Template( config.MAIN_CARD ).render( Context(context) )
  246. orts = {}
  247. for product in context['product_list']:
  248. if not product.ort in orts:
  249. orts[product.ort] = product.get_ort_display()
  250. context['ort_dict'] = orts
  251. context['frei_list'] = Product.FREI
  252. context['status_list'] = Product.STATUS
  253. return context
  254. class WohnprojekteView(ProductsView):
  255. model = Wohnprojekt
  256. template_name = 'marktplatz/product_overview.html'
  257. def get_context_data(self, **kwargs):
  258. context = super().get_context_data(**kwargs)
  259. raum_agebote = {}
  260. for product in context['product_list']:
  261. for raum in product.raumangebot:
  262. if not (raum in raum_agebote):
  263. raum_agebote[raum] = product.raumangebot.choices[raum]
  264. context['raum_agebote_dict'] = raum_agebote
  265. context['frei_list'][0] = ('JAJA', 'Platz frei')
  266. context['altneu_list'] = Wohnprojekt.ALTNEU
  267. return context
  268. class MobilitaetsProjekteView(ProductsView):
  269. model = MobilitaetsProjekt
  270. template_name = 'marktplatz/product_overview.html'
  271. class ErnaerungsProjekteView(ProductsView):
  272. model = ErnaehrungsProjekt
  273. template_name = 'marktplatz/product_overview.html'
  274. class EnergyProjekteView(ProductsView):
  275. model = EnergyProjekt
  276. template_name = 'marktplatz/product_overview.html'
  277. class FilterProductsView(ProductsView):
  278. def get_queryset(self, qfilter=None, **kwargs ):
  279. # original qs
  280. qs = super().get_queryset()
  281. if qfilter!=None:
  282. mfilter = {}
  283. mfilter[qfilter] = True
  284. qs = qs.filter ( **mfilter )
  285. qs = qs.order_by('frei')
  286. return qs.filter(public = True)
  287. def get(self, request, *args, **kwargs):
  288. qfilter = kwargs.get('filter', "")
  289. if qfilter != "":
  290. self.object_list = self.get_queryset(qfilter= qfilter )
  291. allow_empty = self.get_allow_empty()
  292. # if not allow_empty:
  293. # # When pagination is enabled and object_list is a queryset,
  294. # # it's better to do a cheap query than to load the unpaginated
  295. # # queryset in memory.
  296. # if self.get_paginate_by(self.object_list) is not None and hasattr(self.object_list, 'exists'):
  297. # is_empty = not self.object_list.exists()
  298. # else:
  299. # is_empty = not self.object_list
  300. # if is_empty:
  301. # raise Http404(_("Empty list and '%(class_name)s.allow_empty' is False.") % {
  302. # 'class_name': self.__class__.__name__,
  303. # })
  304. context = self.get_context_data()
  305. return self.render_to_response(context)
  306. class SearchProductsView(ProductsView):
  307. def get_queryset(self, qfilter=None, **kwargs ):
  308. # original qs
  309. qs = super().get_queryset()
  310. self.user = self.request.user
  311. user = self.user
  312. if qfilter!=None:
  313. 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)
  314. qs = qs.order_by('frei')
  315. return qs.filter(public = True)
  316. def post(self, request, *args, **kwargs):
  317. qform = textSearchForm( request.POST )
  318. if qform.is_valid():
  319. self.object_list = self.get_queryset(qfilter= qform.cleaned_data["searchText"] )
  320. allow_empty = self.get_allow_empty()
  321. if not allow_empty:
  322. # When pagination is enabled and object_list is a queryset,
  323. # it's better to do a cheap query than to load the unpaginated
  324. # queryset in memory.
  325. if self.get_paginate_by(self.object_list) is not None and hasattr(self.object_list, 'exists'):
  326. is_empty = not self.object_list.exists()
  327. else:
  328. is_empty = not self.object_list
  329. if is_empty:
  330. raise Http404(_("Empty list and '%(class_name)s.allow_empty' is False.") % {
  331. 'class_name': self.__class__.__name__,
  332. })
  333. context = self.get_context_data()
  334. return self.render_to_response(context)
  335. class ProduktDetailView(generic.DetailView):
  336. model = Product
  337. template_name = 'marktplatz/product_detail.html'
  338. embed = False
  339. def get_context_data(self, **kwargs):
  340. # context = super().get_context_data(**kwargs)
  341. if self.embed :
  342. kwargs['embed'] = True
  343. # context['credits'] = Credit.objects.select_related().get(product = self.kwargs['pk'])
  344. # context['wohnprojekt'] = self.object.wohnprojekt
  345. return super().get_context_data(**kwargs)
  346. def post(self, request, *args, **kwargs):
  347. # vote = int(request.POST['vote'])
  348. comment = str(request.POST['comment'])
  349. return HttpResponseRedirect( reverse('products') )
  350. class ProduktCardDetailView(ProduktDetailView):
  351. template_name = 'marktplatz/product_detail_card.html'
  352. class WohnprojektDetailView(generic.DetailView):
  353. model = Wohnprojekt
  354. template_name = 'marktplatz/wohnprojekt_detail.html'
  355. embed = False
  356. class AdminView(LoginRequiredMixin, generic.ListView):
  357. model = Product
  358. template_name='marktplatz/admin_panel.html'
  359. def get_context_data(self, **kwargs):
  360. context = super().get_context_data(**kwargs)
  361. return context
  362. def post(self, request, *args, **kwargs):
  363. # print (request.POST.dict())
  364. context = request.POST.dict()
  365. public = {k: v for k, v in context.items() if k.startswith('product_p')}
  366. for elemk in public:
  367. keys = elemk.split(".")
  368. current_product = Product.objects.get(pk=keys[1])
  369. if public[elemk] == 'true':
  370. if current_product.public == False :
  371. current_product.public = True
  372. current_product.save()
  373. else:
  374. current_product.public = False
  375. current_product.save()
  376. # edit = {k: v for k, v in context.items() if k.startswith('product_e')}
  377. # for elemk in edit:
  378. # keys = elemk.split(".")
  379. # current_product = Product.objects.get(pk=keys[1])
  380. # if edit[elemk] == 'true'
  381. # if current_product.edit == False :
  382. # current_product.edit = True
  383. # current_product.save()
  384. # else:
  385. # current_product.edit = False
  386. # current_product.save()
  387. return HttpResponseRedirect('')
  388. class ProductsListView(generic.ListView):
  389. model = Product
  390. template_name='marktplatz/product_list.html'
  391. embed = False
  392. def get_queryset(self):
  393. # original qs
  394. qs = super().get_queryset()
  395. self.user = self.request.user
  396. user = self.user
  397. if user.is_superuser:
  398. return qs
  399. qs = qs.filter(public = True)
  400. return qs
  401. def get_context_data(self, **kwargs):
  402. if self.embed :
  403. kwargs['embed'] = True
  404. return super().get_context_data(**kwargs)
  405. class lightboximg(LoginRequiredMixin, TemplateView):
  406. template_name = "marktplatz/importold.html"
  407. def post(self, request):
  408. context = {'faild': ''}
  409. faild = ''
  410. from1 = int(request.POST['from'])
  411. to = int(request.POST['to'])
  412. products = Product.objects.all()
  413. i = 0
  414. for product in products:
  415. i+=1
  416. if (i < from1):
  417. continue
  418. if (i > to):
  419. break
  420. medias = product.media_set.all()
  421. for oldmedia in medias:
  422. if not oldmedia.image_norm:
  423. oldpic = oldmedia.image
  424. oldmedia.image_norm.save(oldmedia.filename() + '_norm', oldpic)
  425. oldmedia.save
  426. return render(request, self.template_name, context)
  427. def get(self, request):
  428. context = {'faild': ''}
  429. faild = ''
  430. context['faild'] = faild
  431. return render(request, self.template_name, context)
  432. class registerView(FormView):
  433. template_name = 'marktplatz/form.html'
  434. # form_class = RegisterForm
  435. def get(self, request):
  436. # form = self.form_class()
  437. context = request.GET.dict()
  438. 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>'
  439. context['form'] = RegisterForm
  440. context['signUp'] = SignUpForm
  441. return render(request, self.template_name, context)
  442. def post(self, request):
  443. # print ( request.POST.dict() )
  444. form = SignUpForm(request.POST)
  445. form_contact = RegisterForm(request.POST)
  446. #
  447. # Filter existing emails
  448. #
  449. qs = Contact.objects.filter( email=form_contact.data['email'] )
  450. if ( qs.count() ):
  451. form_contact.add_error('email', "Email already in use, please reset your password.")
  452. if form.is_valid() and form_contact.is_valid():
  453. # print (form.cleaned_data)
  454. # print (form_contact.cleaned_data)
  455. contact = form_contact.save(commit=False)
  456. user = form.save()
  457. user.email = contact.email
  458. user.first_name = contact.first_name
  459. user.last_name = contact.last_name
  460. user.set_password(form.cleaned_data.get('password1'))
  461. user.save()
  462. contact.user = user
  463. contact.save()
  464. username = form.cleaned_data.get('username')
  465. raw_password = form.cleaned_data.get('password1')
  466. group = Group.objects.get(name='submission')
  467. group.user_set.add(user)
  468. user = authenticate(username=username, password=raw_password)
  469. if user is not None:
  470. # A backend authenticated the credentials
  471. login(request, user)
  472. return redirect('products')
  473. else:
  474. # No backend authenticated the credentials
  475. send_mail(
  476. 'error with auth',
  477. 'Error in authorization.' + json.dumps( request.POST.dict() ),
  478. 'awards@berta.mediaarchitecture.org',
  479. ['juan@mediaarchitecture.org'],
  480. fail_silently=False,
  481. )
  482. return redirect('products')
  483. login(request, user)
  484. else:
  485. # print (form.errors)
  486. # print (form_contact.errors)
  487. send_mail(
  488. 'error with auth',
  489. '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),
  490. 'awards@berta.mediaarchitecture.org',
  491. ['juan@mediaarchitecture.org'],
  492. fail_silently=False,
  493. )
  494. context = request.POST.dict()
  495. context['signUp'] = form
  496. context['form'] = form_contact
  497. context['signup_errors'] = form.errors
  498. context['contact_errors'] = form_contact.errors
  499. return render(request, self.template_name, context)
  500. context = request.GET.dict()
  501. context['form'] = RegisterForm
  502. context['signUp'] = SignUpForm
  503. return render(request, self.template_name, context)
  504. # class NewProductView(LoginRequiredMixin, FormView):
  505. # use_ajax = True
  506. # template_name = 'marktplatz/add.html'
  507. #
  508. # model = Product
  509. class ProductCreateView(LoginRequiredMixin, CreateView):
  510. template_name = 'marktplatz/product_create.html'
  511. model = Product
  512. form_class = ProductForm
  513. gotoPics = False
  514. def get_context_data(self, **kwargs):
  515. context = super().get_context_data(**kwargs)
  516. context['info_txt'] = Template(config.INFO_TXT).render(Context(context))
  517. return context
  518. def post(self, request, *args, **kwargs):
  519. if 'add-image' in request.POST:
  520. self.gotoPics = True
  521. return super().post(self, request, *args, **kwargs)
  522. def form_valid(self, form):
  523. product = form.save(commit=False)
  524. product.contact = Contact.objects.get(user = self.request.user)
  525. product.save()
  526. if (self.gotoPics):
  527. return HttpResponseRedirect(reverse('add-image', kwargs={'pk': product.pk}))
  528. else:
  529. return HttpResponseRedirect( reverse('meine-projekte') )
  530. class WohnProjektCreateView(ProductCreateView):
  531. model = Wohnprojekt
  532. form_class = WohnprojektForm
  533. class MobilitaetsProjektCreateView(ProductCreateView):
  534. model = MobilitaetsProjekt
  535. form_class = MobilitaetsForm
  536. class ErnaehrungsProjektCreateView(ProductCreateView):
  537. model = ErnaehrungsProjekt
  538. form_class = ErnaehrungsForm
  539. class EnergyProjektCreateView(ProductCreateView):
  540. model = EnergyProjekt
  541. form_class = EnergyForm
  542. # class ProductUpdateView(LoginRequiredMixin, View):
  543. #
  544. # def dispatch(request, *args, **kwargs):
  545. #
  546. # pass
  547. class ProductUpdateView(LoginRequiredMixin, UpdateView):
  548. template_name = 'marktplatz/product_create.html'
  549. model = Product
  550. form_class = ProductForm
  551. gotoPics = False
  552. # success_url =
  553. def get_context_data(self, **kwargs):
  554. context = super().get_context_data(**kwargs)
  555. context['info_txt'] = Template(config.INFO_TXT).render(Context(context))
  556. return context
  557. def get_object(self, queryset=None):
  558. obj = super().get_object()
  559. if ( obj.user_can_manage(self.request.user) ):
  560. return obj
  561. raise PermissionDenied
  562. def post(self, request, *args, **kwargs):
  563. if 'add-image' in request.POST:
  564. self.gotoPics = True
  565. return super().post(self, request, *args, **kwargs)
  566. def get(self, request, *args, **kwargs):
  567. return super().get(self, request, *args, **kwargs)
  568. def form_valid(self, form):
  569. product = form.save(commit=False)
  570. product.contact = Contact.objects.get(user = self.request.user)
  571. product.save()
  572. if (self.gotoPics):
  573. return HttpResponseRedirect(reverse('add-image', kwargs={'pk': product.pk}))
  574. else:
  575. return HttpResponseRedirect( reverse('meine-projekte') )
  576. class ProductGenericUpdateView(ProductUpdateView):
  577. model = Product
  578. form_class = ProductForm
  579. def dispatch(self, request, *args, **kwargs):
  580. if self.kwargs['type'] == 'BASE':
  581. super().dispatch(request, *args, **kwargs)
  582. elif self.kwargs['type'] == 'WOHN':
  583. self.model = Wohnprojekt
  584. self.form_class = WohnprojektForm
  585. return super().dispatch(request, *args, **kwargs)
  586. elif self.kwargs['type'] == 'MOBI':
  587. self.model = MobilitaetsProjekt
  588. self.form_class = MobilitaetsForm
  589. return super().dispatch(request, *args, **kwargs)
  590. elif self.kwargs['type'] == 'ERNA':
  591. self.model = ErnaehrungsProjekt
  592. self.form_class = ErnaehrungsForm
  593. return super().dispatch(request, *args, **kwargs)
  594. elif self.kwargs['type'] == 'ENER':
  595. self.model = EnergyProjekt
  596. self.form_class = EnergyForm
  597. return super().dispatch(request, *args, **kwargs)
  598. raise Http404('Keine Objekte gefunden' )
  599. class WohnProjektUpdateView(ProductUpdateView):
  600. model = Wohnprojekt
  601. form_class = WohnprojektForm
  602. class MobilitaetsProjektUpdateView(ProductUpdateView):
  603. model = MobilitaetsProjekt
  604. form_class = MobilitaetsForm
  605. class ErnaehrungsProjektUpdateView(ProductUpdateView):
  606. model = ErnaehrungsProjekt
  607. form_class = ErnaehrungsForm
  608. class EnergyProjektUpdateView(ProductUpdateView):
  609. model = EnergyProjekt
  610. form_class = EnergyForm
  611. class addImageView(LoginRequiredMixin, FormView):
  612. use_ajax = True
  613. template_name = 'marktplatz/file_upload.html'
  614. def get(self, request, pk):
  615. user = self.request.user
  616. contact = Contact.objects.get(user=user)
  617. print (contact.id)
  618. product = Product.objects.filter(contact=contact)
  619. if not Product.objects.filter(contact=contact).filter(pk=pk).exists():
  620. print( "no product 1" )
  621. raise Http404
  622. product = Product.objects.get(pk=pk)
  623. photo = product.media_set.count()
  624. video = product.video_set.count()
  625. context = request.GET.dict()
  626. contact = Contact.objects.get(user=self.request.user)
  627. print( "before 404" )
  628. product = get_object_or_404(Product, (Q(pk=pk) & Q(contact=contact)))
  629. context['product'] = product
  630. context['images'] = Media.objects.filter(product=product)
  631. context['video'] = Video.objects.filter(product=product)
  632. context['media'] = MediaForm
  633. context['media_count'] = False
  634. context['video_count'] = False
  635. if photo >= 7:
  636. context['media_count'] = True
  637. if video >= 2:
  638. context['video_count'] = True
  639. # context['use_ajax'] = True
  640. context['warning'] = False
  641. return render(request, self.template_name, context)
  642. def post(self, request, pk):
  643. vid1_f = MediaForm(request.POST, request.FILES)
  644. product = Product.objects.get(pk=pk)
  645. i = product.media_set.count()
  646. i += product.video_set.count()
  647. video = product.video_set.count()
  648. photo = product.media_set.count()
  649. context = request.GET.dict()
  650. contact = Contact.objects.get(user=self.request.user)
  651. product = get_object_or_404(Product, (Q(pk=pk) & Q(contact=contact)))
  652. context['product'] = product
  653. context['images'] = Media.objects.filter(product=product)
  654. context['video'] = Video.objects.filter(product=product)
  655. context['media'] = MediaForm
  656. context['media_count'] = False
  657. context['video_count'] = False
  658. context['use_ajax'] = True
  659. context['warning'] = False
  660. if vid1_f.is_valid():
  661. image = vid1_f.cleaned_data['image']
  662. name = image.name
  663. if 'png' in name or 'jpg' in name or 'jpeg' in name:
  664. if photo < 7:
  665. vid1 = Media()
  666. vid1.product = product
  667. vid1.filename = name
  668. vid1.copyright = vid1_f.cleaned_data['copyright']
  669. vid1.name_for = vid1_f.cleaned_data['name_for']
  670. vid1.image.save(name, image)
  671. vid1.image_small.save(str(i) + '_small', image)
  672. vid1.image_medium.save(str(i) + '_medium', image)
  673. vid1.image_big.save(str(i) + '_big', image)
  674. vid1.image_norm.save(str(i) + '_norm', image)
  675. vid1.save
  676. photo += 1
  677. else:
  678. context['warning'] = "You can not upload any more photos!"
  679. elif 'mp4' in name or 'm3u8' in name or 'm4v' in name:
  680. if video < 2:
  681. #TODO clean image here!
  682. vid1 = Video()
  683. vid1.product = product
  684. vid1.filename = name
  685. vid1.copyright = vid1_f.cleaned_data['copyright']
  686. vid1.name_for = vid1_f.cleaned_data['name_for']
  687. vid1.image.save(name, image)
  688. vid1.save
  689. video += 1
  690. else:
  691. context['warning'] = "You can not upload any more videos!"
  692. vid1_f.delete_temporary_files()
  693. if photo >= 7:
  694. context['media_count'] = True
  695. if video >= 2:
  696. context['video_count'] = True
  697. return render(request, self.template_name, context)
  698. handle_upload = FileFormUploader()
  699. # class EditView(LoginRequiredMixin, FormView):
  700. #
  701. # template_name = 'marktplatz/add.html'
  702. #
  703. # def get(self, request, pk):
  704. # user = self.request.user
  705. # contact = Contact.objects.get(user=user)
  706. # if not Product.objects.filter(contact=contact).filter(pk=pk).exists():
  707. # raise Http404
  708. #
  709. # context = request.GET.dict()
  710. #
  711. # context['product'] = WohnprojektForm(instance=Wohnprojekt.objects.get(pk=pk))
  712. #
  713. #
  714. # context['use_ajax'] = True
  715. # context['info_txt'] = Template(config.INFO_TXT).render(Context(context))
  716. #
  717. # return render(request, self.template_name, context)
  718. #
  719. # def post(self, request, pk):
  720. #
  721. # product_f = WohnprojektForm(request.POST, request.FILES, instance=Wohnprojekt.objects.get(pk=pk))
  722. #
  723. # if product_f.is_valid():
  724. # if product_f.has_changed():
  725. # product = product_f.save( commit=False )
  726. # update_fields = product_f.changed_data
  727. # product.current_uri = request.build_absolute_uri( '/' ).rstrip('/')
  728. # product.save( update_fields=update_fields )
  729. # # product.save( )
  730. #
  731. # if 'add-image' in request.POST:
  732. # return HttpResponseRedirect(reverse('add-image', kwargs={'pk': pk}))
  733. #
  734. # return HttpResponseRedirect(reverse('meine-projekte'))
  735. #
  736. # else:
  737. # context = request.GET.dict()
  738. # context['product'] = product_f
  739. # context['product_errors'] = product_f.errors
  740. # context['use_ajax'] = True
  741. # return render(request, self.template_name, context)
  742. class UsersProducts(LoginRequiredMixin, generic.ListView):
  743. model = Product
  744. template_name='marktplatz/myProducts.html'
  745. def get_queryset(self):
  746. contact = Contact.objects.get(user=self.request.user)
  747. wohnprojekte = Wohnprojekt.objects.filter(contact=contact)
  748. mobilitaetsprojekte = MobilitaetsProjekt.objects.filter(contact=contact)
  749. ernaehrungsprojekte = ErnaehrungsProjekt.objects.filter(contact=contact)
  750. energyprojekte = EnergyProjekt.objects.filter(contact=contact)
  751. projekte = list(itertools.chain(wohnprojekte, mobilitaetsprojekte, ernaehrungsprojekte, energyprojekte))
  752. return projekte
  753. def get_context_data(self, **kwargs):
  754. context = super().get_context_data(**kwargs)
  755. contact = Contact.objects.get(user=self.request.user)
  756. context['user'] = self.request.user
  757. return context
  758. class MediaView(LoginRequiredMixin, TemplateView):
  759. template_name = 'marktplatz/media_overview.html'
  760. def get(self, request, pk):
  761. self.user = self.request.user
  762. user= self.user
  763. contact = Contact.objects.get(user=user)
  764. if not Product.objects.filter(contact=contact).filter(pk=pk).exists():
  765. raise Http404
  766. context = request.GET.dict()
  767. contact = Contact.objects.get(user=self.request.user)
  768. product = get_object_or_404(Product, (Q(pk = pk) & Q(contact = contact)))
  769. context['product'] = product
  770. context['media'] = Media.objects.filter(product=product)
  771. context['video'] = Video.objects.filter(product=product)
  772. return render(request, self.template_name, context)
  773. def delete_media(request, pk):
  774. user = request.user
  775. contact = Contact.objects.get(user=user)
  776. object = Media.objects.get(id=pk)
  777. if not Product.objects.filter(contact=contact).filter(pk=object.product.pk).exists():
  778. raise Http404
  779. object.delete()
  780. return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/'))
  781. def delete_video(request, pk):
  782. user = request.user
  783. contact = Contact.objects.get(user=user)
  784. object = Video.objects.get(id=pk)
  785. if not Product.objects.filter(contact=contact).filter(pk=object.product.pk).exists():
  786. raise Http404
  787. object.delete()
  788. return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/'))