views.py 36 KB

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