views.py 32 KB

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