views.py 36 KB

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