views.py 39 KB

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