views.py 37 KB

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