views.py 35 KB

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