views.py 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971
  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.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. if settings.DEBUG:
  164. return render(request, self.template_name, context )
  165. else:
  166. return super().get(self, request, *args, **kwargs)
  167. else:
  168. context['form_content'] = 'Oopala, das hat nicht geklappt.'
  169. return render(request, self.template_name, context )
  170. class ProductDelete(LoginRequiredMixin, DeleteView):
  171. model = Product
  172. template_name = 'marktplatz/product_delete.html'
  173. success_url = reverse_lazy('products')
  174. def get(self, request, *args, **kwargs):
  175. contact = get_object_or_404(Contact, user= self.request.user ) # Contact.objects.get(user=self.request.user)
  176. product = get_object_or_404(Product, pk= kwargs.get('pk') )
  177. if (contact.id == product.contact.id) :
  178. return super(ProductDelete, self).get(self, request, *args, **kwargs)
  179. else:
  180. raise Http404
  181. def post(self, request, *args, **kwargs):
  182. contact = get_object_or_404(Contact, user= self.request.user ) # Contact.objects.get(user=self.request.user)
  183. product = get_object_or_404(Product, pk= kwargs.get('pk') )
  184. if (contact.id == product.contact.id) :
  185. # context = {}
  186. # context['form_content'] = 'Dein Projekt wird gelöscht, wenn die Seite live ist!'
  187. # if settings.DEBUG:
  188. # return render(request, self.template_name, context )
  189. # else:
  190. return super().post(self, request, *args, **kwargs)
  191. else:
  192. raise Http404
  193. context = {}
  194. context['form_content'] = 'Oopala, das hat nicht geklappt.'
  195. return render(request, self.template_name, context )
  196. class ProductPublish(LoginRequiredMixin, DetailView):
  197. model = Product
  198. template_name = 'marktplatz/generic.html'
  199. # success_url = reverse_lazy('products')
  200. #
  201. def get(self, request, *args, **kwargs):
  202. contact = get_object_or_404(Contact, user= self.request.user ) # Contact.objects.get(user=self.request.user)
  203. product = get_object_or_404(Product, pk= kwargs.get('pk') )
  204. if (contact.id == product.contact.id) :
  205. product_url = reverse( 'product-detail', kwargs= { 'pk': product.pk } )
  206. publishmessage = "Ein Benutzer möchte folgendes Projekt freigeben: {}, {}".format( product.name, request.get_host() + product_url )
  207. userList =User.objects.filter( is_superuser = 1 )
  208. for superuser in userList:
  209. mail.send(
  210. superuser.email, # List of email addresses also accepted
  211. config.EMAIL_NOREPLY,
  212. subject='Projekt Freschaltung',
  213. headers={ 'Reply-To': superuser.email },
  214. message= publishmessage,
  215. # html_message='Hi <strong>there</strong>!',
  216. )
  217. context = {}
  218. context["content_a"] = '<br><br><br>Die Freigabe wurde beantragt.<br><br><br>'
  219. return render(request, self.template_name, context )
  220. else:
  221. raise Http404
  222. class ProductsView(generic.ListView):
  223. model = Wohnprojekt
  224. #context_object_name = 'Products'
  225. def get_queryset(self):
  226. # original qs
  227. qs = super().get_queryset()
  228. self.user = self.request.user
  229. user = self.user
  230. qs = qs.order_by('frei')
  231. if user.groups.filter(name='submission').exists():
  232. contact = Contact.objects.get(user=user)
  233. return qs.filter(contact = contact)
  234. if user.is_superuser:
  235. return qs
  236. qs = qs.filter(public = True)
  237. return qs
  238. def get_context_data(self, **kwargs):
  239. context = super().get_context_data(**kwargs)
  240. user =self.request.user
  241. context['user'] = user
  242. used_countries = []
  243. orts = {}
  244. years = {''}
  245. raum_agebote = {}
  246. for product in context['wohnprojekt_list']:
  247. if not years.__contains__(product.year):
  248. years.add(product.year)
  249. for country in product.country:
  250. if not used_countries.__contains__(country):
  251. used_countries.append(country)
  252. # if not used_orts.__contains__( product.get_ort_display() ):
  253. if not product.ort in orts:
  254. orts[product.ort] = product.get_ort_display()
  255. # print (product.raumangebot.get_list() )
  256. for raum in product.raumangebot:
  257. if not (raum in raum_agebote):
  258. raum_agebote[raum] = product.raumangebot.choices[raum]
  259. years.remove('')
  260. context['year_list'] = years
  261. context['count_list'] = used_countries
  262. context['frei_list'] = Product.FREI
  263. context['frei_list'][0] = ('JAJA', 'Wohnung frei')
  264. context['status_list'] = Product.STATUS
  265. context['ort_dict'] = orts
  266. context['raum_agebote_dict'] = raum_agebote
  267. context['altneu_list'] = Wohnprojekt.ALTNEU
  268. context['sponsor_cards'] = Template( config.SPONSOR_CARDS ).render( Context(context) )
  269. context['main_card'] = Template( config.MAIN_CARD ).render( Context(context) )
  270. context['textSearchForm'] = textSearchForm()
  271. return context
  272. # def get(self, request, *args, **kwargs):
  273. # print(request.user_agent)
  274. # return super().get(self, request, *args, **kwargs)
  275. template_name = 'marktplatz/product_overview.html'
  276. class FilterProductsView(ProductsView):
  277. def get_queryset(self, qfilter=None, **kwargs ):
  278. # original qs
  279. qs = super().get_queryset()
  280. if qfilter!=None:
  281. mfilter = {}
  282. mfilter[qfilter] = True
  283. qs = qs.filter ( **mfilter )
  284. qs = qs.order_by('frei')
  285. return qs.filter(public = True)
  286. def get(self, request, *args, **kwargs):
  287. qfilter = kwargs.get('filter', "")
  288. if qfilter != "":
  289. self.object_list = self.get_queryset(qfilter= qfilter )
  290. allow_empty = self.get_allow_empty()
  291. # if not allow_empty:
  292. # # When pagination is enabled and object_list is a queryset,
  293. # # it's better to do a cheap query than to load the unpaginated
  294. # # queryset in memory.
  295. # if self.get_paginate_by(self.object_list) is not None and hasattr(self.object_list, 'exists'):
  296. # is_empty = not self.object_list.exists()
  297. # else:
  298. # is_empty = not self.object_list
  299. # if is_empty:
  300. # raise Http404(_("Empty list and '%(class_name)s.allow_empty' is False.") % {
  301. # 'class_name': self.__class__.__name__,
  302. # })
  303. context = self.get_context_data()
  304. return self.render_to_response(context)
  305. class SearchProductsView(ProductsView):
  306. def get_queryset(self, qfilter=None, **kwargs ):
  307. # original qs
  308. qs = super().get_queryset()
  309. self.user = self.request.user
  310. user = self.user
  311. if qfilter!=None:
  312. 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)
  313. qs = qs.order_by('frei')
  314. return qs.filter(public = True)
  315. def post(self, request, *args, **kwargs):
  316. qform = textSearchForm( request.POST )
  317. if qform.is_valid():
  318. self.object_list = self.get_queryset(qfilter= qform.cleaned_data["searchText"] )
  319. allow_empty = self.get_allow_empty()
  320. if not allow_empty:
  321. # When pagination is enabled and object_list is a queryset,
  322. # it's better to do a cheap query than to load the unpaginated
  323. # queryset in memory.
  324. if self.get_paginate_by(self.object_list) is not None and hasattr(self.object_list, 'exists'):
  325. is_empty = not self.object_list.exists()
  326. else:
  327. is_empty = not self.object_list
  328. if is_empty:
  329. raise Http404(_("Empty list and '%(class_name)s.allow_empty' is False.") % {
  330. 'class_name': self.__class__.__name__,
  331. })
  332. context = self.get_context_data()
  333. return self.render_to_response(context)
  334. class DetailView(generic.DetailView):
  335. model = Product
  336. template_name = 'marktplatz/product_detail.html'
  337. embed = False
  338. def get_context_data(self, **kwargs):
  339. # context = super().get_context_data(**kwargs)
  340. if self.embed :
  341. kwargs['embed'] = True
  342. # context['credits'] = Credit.objects.select_related().get(product = self.kwargs['pk'])
  343. # context['wohnprojekt'] = self.object.wohnprojekt
  344. return super().get_context_data(**kwargs)
  345. def post(self, request, *args, **kwargs):
  346. vote = int(request.POST['vote'])
  347. comment = str(request.POST['comment'])
  348. if vote <= 10:
  349. try:
  350. get_vote = Vote.objects.get(juryMember=self.request.user, product=self.kwargs['pk'])
  351. get_vote.vote = vote
  352. get_vote.comment = comment
  353. get_vote.save()
  354. except Vote.DoesNotExist:
  355. get_vote = Vote(product = Product.objects.get(pk=self.kwargs['pk']), juryMember= self.request.user, vote = vote, comment=comment)
  356. get_vote.save()
  357. else:
  358. return HttpResponseRedirect(request.path)
  359. return HttpResponseRedirect(reverse('products'))
  360. class CardDetailView(DetailView):
  361. template_name = 'marktplatz/product_detail_card.html'
  362. class AdminView(LoginRequiredMixin, generic.ListView):
  363. model = Product
  364. template_name='marktplatz/admin_panel.html'
  365. def get_context_data(self, **kwargs):
  366. context = super().get_context_data(**kwargs)
  367. return context
  368. def post(self, request, *args, **kwargs):
  369. # print (request.POST.dict())
  370. context = request.POST.dict()
  371. public = {k: v for k, v in context.items() if k.startswith('product_p')}
  372. for elemk in public:
  373. keys = elemk.split(".")
  374. current_product = Product.objects.get(pk=keys[1])
  375. if public[elemk] == 'true':
  376. if current_product.public == False :
  377. current_product.public = True
  378. current_product.save()
  379. else:
  380. current_product.public = False
  381. current_product.save()
  382. # edit = {k: v for k, v in context.items() if k.startswith('product_e')}
  383. # for elemk in edit:
  384. # keys = elemk.split(".")
  385. # current_product = Product.objects.get(pk=keys[1])
  386. # if edit[elemk] == 'true'
  387. # if current_product.edit == False :
  388. # current_product.edit = True
  389. # current_product.save()
  390. # else:
  391. # current_product.edit = False
  392. # current_product.save()
  393. return HttpResponseRedirect('')
  394. class ProductsListView(generic.ListView):
  395. model = Product
  396. template_name='marktplatz/product_list.html'
  397. embed = False
  398. def get_queryset(self):
  399. # original qs
  400. qs = super().get_queryset()
  401. self.user = self.request.user
  402. user = self.user
  403. if user.is_superuser:
  404. return qs
  405. qs = qs.filter(public = True)
  406. return qs
  407. def get_context_data(self, **kwargs):
  408. if self.embed :
  409. kwargs['embed'] = True
  410. return super().get_context_data(**kwargs)
  411. class lightboximg(LoginRequiredMixin, TemplateView):
  412. template_name = "marktplatz/importold.html"
  413. def post(self, request):
  414. context = {'faild': ''}
  415. faild = ''
  416. from1 = int(request.POST['from'])
  417. to = int(request.POST['to'])
  418. products = Product.objects.all()
  419. i = 0
  420. for product in products:
  421. i+=1
  422. if (i < from1):
  423. continue
  424. if (i > to):
  425. break
  426. medias = product.media_set.all()
  427. for oldmedia in medias:
  428. if not oldmedia.image_norm:
  429. oldpic = oldmedia.image
  430. oldmedia.image_norm.save(oldmedia.filename() + '_norm', oldpic)
  431. oldmedia.save
  432. return render(request, self.template_name, context)
  433. def get(self, request):
  434. context = {'faild': ''}
  435. faild = ''
  436. context['faild'] = faild
  437. return render(request, self.template_name, context)
  438. class registerView(FormView):
  439. template_name = 'marktplatz/form.html'
  440. # form_class = RegisterForm
  441. def get(self, request):
  442. # form = self.form_class()
  443. context = request.GET.dict()
  444. 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>'
  445. context['form'] = RegisterForm
  446. context['signUp'] = SignUpForm
  447. return render(request, self.template_name, context)
  448. def post(self, request):
  449. # print ( request.POST.dict() )
  450. form = SignUpForm(request.POST)
  451. form_contact = RegisterForm(request.POST)
  452. #
  453. # Filter existing emails
  454. #
  455. qs = Contact.objects.filter( email=form_contact.data['email'] )
  456. if ( qs.count() ):
  457. form_contact.add_error('email', "Email already in use, please reset your password.")
  458. if form.is_valid() and form_contact.is_valid():
  459. # print (form.cleaned_data)
  460. # print (form_contact.cleaned_data)
  461. contact = form_contact.save(commit=False)
  462. user = form.save()
  463. user.email = contact.email
  464. user.first_name = contact.first_name
  465. user.last_name = contact.last_name
  466. user.set_password(form.cleaned_data.get('password1'))
  467. user.save()
  468. contact.user = user
  469. contact.save()
  470. username = form.cleaned_data.get('username')
  471. raw_password = form.cleaned_data.get('password1')
  472. group = Group.objects.get(name='submission')
  473. group.user_set.add(user)
  474. user = authenticate(username=username, password=raw_password)
  475. if user is not None:
  476. # A backend authenticated the credentials
  477. login(request, user)
  478. return redirect('products')
  479. else:
  480. # No backend authenticated the credentials
  481. send_mail(
  482. 'error with auth',
  483. 'Error in authorization.' + json.dumps( request.POST.dict() ),
  484. 'awards@berta.mediaarchitecture.org',
  485. ['juan@mediaarchitecture.org'],
  486. fail_silently=False,
  487. )
  488. return redirect('products')
  489. login(request, user)
  490. else:
  491. # print (form.errors)
  492. # print (form_contact.errors)
  493. send_mail(
  494. 'error with auth',
  495. '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),
  496. 'awards@berta.mediaarchitecture.org',
  497. ['juan@mediaarchitecture.org'],
  498. fail_silently=False,
  499. )
  500. context = request.POST.dict()
  501. context['signUp'] = form
  502. context['form'] = form_contact
  503. context['signup_errors'] = form.errors
  504. context['contact_errors'] = form_contact.errors
  505. return render(request, self.template_name, context)
  506. context = request.GET.dict()
  507. context['form'] = RegisterForm
  508. context['signUp'] = SignUpForm
  509. return render(request, self.template_name, context)
  510. class NewProductView(LoginRequiredMixin, FormView):
  511. use_ajax = True
  512. template_name = 'marktplatz/add.html'
  513. model = Product
  514. class NewWohnprojektView(LoginRequiredMixin, FormView):
  515. use_ajax = True
  516. template_name = 'marktplatz/add.html'
  517. model = Product
  518. def get(self, request,*args, **kwargs):
  519. # form = self.form_class()
  520. context = request.GET.dict()
  521. context['product'] = WohnprojektForm
  522. context['use_ajax'] = True
  523. context['info_txt'] = Template(config.INFO_TXT).render(Context(context))
  524. return render(request, self.template_name, context)
  525. def post(self, request):
  526. product_f = WohnprojektForm(request.POST, request.FILES)
  527. if product_f.is_valid():
  528. product = product_f.save(commit=False)
  529. product.contact = Contact.objects.get(user = self.request.user)
  530. product.edit=True
  531. product.public = False
  532. product.sumbitted = config.CURRENT_EVENT
  533. product.save( )
  534. # product_f.save_m2m()
  535. if 'addImage' in request.POST:
  536. return HttpResponseRedirect(reverse('add-Image', kwargs={'pk': product.pk}))
  537. return HttpResponseRedirect(reverse('my-products'))
  538. else:
  539. context = request.POST.dict()
  540. context['product'] = product_f
  541. context['product_errors'] = product_f.errors
  542. context['use_ajax'] = True
  543. return render(request, self.template_name, context)
  544. class uploadView(LoginRequiredMixin, FormView):
  545. use_ajax = True
  546. template_name = 'marktplatz/file_upload.html'
  547. def get(self, request, pk):
  548. user = self.request.user
  549. contact = Contact.objects.get(user=user)
  550. if not Product.objects.filter(contact=contact).filter(pk=pk).exists():
  551. raise Http404
  552. product = Product.objects.get(pk=pk)
  553. photo = product.media_set.count()
  554. video = product.video_set.count()
  555. context = request.GET.dict()
  556. contact = Contact.objects.get(user=self.request.user)
  557. product = get_object_or_404(Wohnprojekt, (Q(pk=pk) & Q(contact=contact)))
  558. context['product'] = product
  559. context['images'] = Media.objects.filter(product=product)
  560. context['video'] = Video.objects.filter(product=product)
  561. context['media'] = MediaForm
  562. context['media_count'] = False
  563. context['video_count'] = False
  564. if photo >= 7:
  565. context['media_count'] = True
  566. if video >= 2:
  567. context['video_count'] = True
  568. context['use_ajax'] = True
  569. context['warning'] = False
  570. return render(request, self.template_name, context)
  571. def post(self, request, pk):
  572. vid1_f = MediaForm(request.POST, request.FILES)
  573. product = Product.objects.get(pk=pk)
  574. i = product.media_set.count()
  575. i += product.video_set.count()
  576. video = product.video_set.count()
  577. photo = product.media_set.count()
  578. context = request.GET.dict()
  579. contact = Contact.objects.get(user=self.request.user)
  580. product = get_object_or_404(Product, (Q(pk=pk) & Q(contact=contact)))
  581. context['product'] = product
  582. context['images'] = Media.objects.filter(product=product)
  583. context['video'] = Video.objects.filter(product=product)
  584. context['media'] = MediaForm
  585. context['media_count'] = False
  586. context['video_count'] = False
  587. context['use_ajax'] = True
  588. context['warning'] = False
  589. if vid1_f.is_valid():
  590. image = vid1_f.cleaned_data['image']
  591. name = image.name
  592. if 'png' in name or 'jpg' in name or 'jpeg' in name:
  593. if photo < 7:
  594. vid1 = Media()
  595. vid1.product = product
  596. vid1.filename = name
  597. vid1.copyright = vid1_f.cleaned_data['copyright']
  598. vid1.name_for = vid1_f.cleaned_data['name_for']
  599. vid1.image.save(name, image)
  600. vid1.image_small.save(str(i) + '_small', image)
  601. vid1.image_medium.save(str(i) + '_medium', image)
  602. vid1.image_big.save(str(i) + '_big', image)
  603. vid1.image_norm.save(str(i) + '_norm', image)
  604. vid1.save
  605. photo += 1
  606. else:
  607. context['warning'] = "You can not upload any more photos!"
  608. elif 'mp4' in name or 'm3u8' in name or 'm4v' in name:
  609. if video < 2:
  610. #TODO clean image here!
  611. vid1 = Video()
  612. vid1.product = product
  613. vid1.filename = name
  614. vid1.copyright = vid1_f.cleaned_data['copyright']
  615. vid1.name_for = vid1_f.cleaned_data['name_for']
  616. vid1.image.save(name, image)
  617. vid1.save
  618. video += 1
  619. else:
  620. context['warning'] = "You can not upload any more videos!"
  621. vid1_f.delete_temporary_files()
  622. if photo >= 7:
  623. context['media_count'] = True
  624. if video >= 2:
  625. context['video_count'] = True
  626. return render(request, self.template_name, context)
  627. handle_upload = FileFormUploader()
  628. class EditView(LoginRequiredMixin, FormView):
  629. template_name = 'marktplatz/add.html'
  630. def get(self, request, pk):
  631. user = self.request.user
  632. contact = Contact.objects.get(user=user)
  633. if not Product.objects.filter(contact=contact).filter(pk=pk).exists():
  634. raise Http404
  635. context = request.GET.dict()
  636. context['product'] = WohnprojektForm(instance=Wohnprojekt.objects.get(pk=pk))
  637. context['use_ajax'] = True
  638. context['info_txt'] = Template(config.INFO_TXT).render(Context(context))
  639. return render(request, self.template_name, context)
  640. def post(self, request, pk):
  641. product_f = WohnprojektForm(request.POST, request.FILES, instance=Wohnprojekt.objects.get(pk=pk))
  642. if product_f.is_valid():
  643. if product_f.has_changed():
  644. product = product_f.save( commit=False )
  645. update_fields = product_f.changed_data
  646. product.current_uri = request.build_absolute_uri( '/' ).rstrip('/')
  647. product.save( update_fields=update_fields )
  648. # product.save( )
  649. if 'addImage' in request.POST:
  650. return HttpResponseRedirect(reverse('add-Image', kwargs={'pk': pk}))
  651. return HttpResponseRedirect(reverse('my-products'))
  652. else:
  653. context = request.GET.dict()
  654. context['product'] = product_f
  655. context['product_errors'] = product_f.errors
  656. context['use_ajax'] = True
  657. return render(request, self.template_name, context)
  658. class UsersProducts(LoginRequiredMixin, generic.ListView):
  659. model = Product
  660. template_name='marktplatz/myProducts.html'
  661. def get_queryset(self):
  662. contact = Contact.objects.get(user=self.request.user)
  663. return Product.objects.filter(contact=contact)
  664. def get_context_data(self, **kwargs):
  665. context = super().get_context_data(**kwargs)
  666. contact = Contact.objects.get(user=self.request.user)
  667. context['user'] = self.request.user
  668. return context
  669. class MediaView(LoginRequiredMixin, TemplateView):
  670. template_name = 'marktplatz/media_overview.html'
  671. def get(self, request, pk):
  672. self.user = self.request.user
  673. user= self.user
  674. contact = Contact.objects.get(user=user)
  675. if not Product.objects.filter(contact=contact).filter(pk=pk).exists():
  676. raise Http404
  677. context = request.GET.dict()
  678. contact = Contact.objects.get(user=self.request.user)
  679. product = get_object_or_404(Product, (Q(pk = pk) & Q(contact = contact)))
  680. context['product'] = product
  681. context['media'] = Media.objects.filter(product=product)
  682. context['video'] = Video.objects.filter(product=product)
  683. return render(request, self.template_name, context)
  684. def delete_media(request, pk):
  685. user = request.user
  686. contact = Contact.objects.get(user=user)
  687. object = Media.objects.get(id=pk)
  688. if not Product.objects.filter(contact=contact).filter(pk=object.product.pk).exists():
  689. raise Http404
  690. object.delete()
  691. return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/'))
  692. def delete_video(request, pk):
  693. user = request.user
  694. contact = Contact.objects.get(user=user)
  695. object = Video.objects.get(id=pk)
  696. if not Product.objects.filter(contact=contact).filter(pk=object.product.pk).exists():
  697. raise Http404
  698. object.delete()
  699. return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/'))