views.py 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972
  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. # print(elemk + " - " + public[elemk] )
  374. keys = elemk.split(".")
  375. current_product = Product.objects.get(pk=keys[1])
  376. if public[elemk] == 'true':
  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. # print (edit)
  384. for elemk in edit:
  385. # print(elemk + " - " + edit[elemk] )
  386. keys = elemk.split(".")
  387. current_product = Product.objects.get(pk=keys[1])
  388. if edit[elemk] == 'true':
  389. current_product.edit = True
  390. current_product.save()
  391. else:
  392. current_product.edit = False
  393. current_product.save()
  394. return HttpResponseRedirect('')
  395. class ProductsListView(generic.ListView):
  396. model = Product
  397. template_name='marktplatz/product_list.html'
  398. embed = False
  399. def get_queryset(self):
  400. # original qs
  401. qs = super().get_queryset()
  402. self.user = self.request.user
  403. user = self.user
  404. if user.is_superuser:
  405. return qs
  406. qs = qs.filter(public = True)
  407. return qs
  408. def get_context_data(self, **kwargs):
  409. if self.embed :
  410. kwargs['embed'] = True
  411. return super().get_context_data(**kwargs)
  412. class lightboximg(LoginRequiredMixin, TemplateView):
  413. template_name = "marktplatz/importold.html"
  414. def post(self, request):
  415. context = {'faild': ''}
  416. faild = ''
  417. from1 = int(request.POST['from'])
  418. to = int(request.POST['to'])
  419. products = Product.objects.all()
  420. i = 0
  421. for product in products:
  422. i+=1
  423. if (i < from1):
  424. continue
  425. if (i > to):
  426. break
  427. medias = product.media_set.all()
  428. for oldmedia in medias:
  429. if not oldmedia.image_norm:
  430. oldpic = oldmedia.image
  431. oldmedia.image_norm.save(oldmedia.filename() + '_norm', oldpic)
  432. oldmedia.save
  433. return render(request, self.template_name, context)
  434. def get(self, request):
  435. context = {'faild': ''}
  436. faild = ''
  437. context['faild'] = faild
  438. return render(request, self.template_name, context)
  439. class registerView(FormView):
  440. template_name = 'marktplatz/form.html'
  441. # form_class = RegisterForm
  442. def get(self, request):
  443. # form = self.form_class()
  444. context = request.GET.dict()
  445. 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>'
  446. context['form'] = RegisterForm
  447. context['signUp'] = SignUpForm
  448. return render(request, self.template_name, context)
  449. def post(self, request):
  450. # print ( request.POST.dict() )
  451. form = SignUpForm(request.POST)
  452. form_contact = RegisterForm(request.POST)
  453. #
  454. # Filter existing emails
  455. #
  456. qs = Contact.objects.filter( email=form_contact.data['email'] )
  457. if ( qs.count() ):
  458. form_contact.add_error('email', "Email already in use, please reset your password.")
  459. if form.is_valid() and form_contact.is_valid():
  460. # print (form.cleaned_data)
  461. # print (form_contact.cleaned_data)
  462. contact = form_contact.save(commit=False)
  463. user = form.save()
  464. user.email = contact.email
  465. user.first_name = contact.first_name
  466. user.last_name = contact.last_name
  467. user.set_password(form.cleaned_data.get('password1'))
  468. user.save()
  469. contact.user = user
  470. contact.save()
  471. username = form.cleaned_data.get('username')
  472. raw_password = form.cleaned_data.get('password1')
  473. group = Group.objects.get(name='submission')
  474. group.user_set.add(user)
  475. user = authenticate(username=username, password=raw_password)
  476. if user is not None:
  477. # A backend authenticated the credentials
  478. login(request, user)
  479. return redirect('products')
  480. else:
  481. # No backend authenticated the credentials
  482. send_mail(
  483. 'error with auth',
  484. 'Error in authorization.' + json.dumps( request.POST.dict() ),
  485. 'awards@berta.mediaarchitecture.org',
  486. ['juan@mediaarchitecture.org'],
  487. fail_silently=False,
  488. )
  489. return redirect('products')
  490. login(request, user)
  491. else:
  492. # print (form.errors)
  493. # print (form_contact.errors)
  494. send_mail(
  495. 'error with auth',
  496. '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),
  497. 'awards@berta.mediaarchitecture.org',
  498. ['juan@mediaarchitecture.org'],
  499. fail_silently=False,
  500. )
  501. context = request.POST.dict()
  502. context['signUp'] = form
  503. context['form'] = form_contact
  504. context['signup_errors'] = form.errors
  505. context['contact_errors'] = form_contact.errors
  506. return render(request, self.template_name, context)
  507. context = request.GET.dict()
  508. context['form'] = RegisterForm
  509. context['signUp'] = SignUpForm
  510. return render(request, self.template_name, context)
  511. class NewProductView(LoginRequiredMixin, FormView):
  512. use_ajax = True
  513. template_name = 'marktplatz/add.html'
  514. model = Product
  515. class NewWohnprojektView(LoginRequiredMixin, FormView):
  516. use_ajax = True
  517. template_name = 'marktplatz/add.html'
  518. model = Product
  519. def get(self, request,*args, **kwargs):
  520. # form = self.form_class()
  521. context = request.GET.dict()
  522. context['product'] = WohnprojektForm
  523. context['use_ajax'] = True
  524. context['info_txt'] = Template(config.INFO_TXT).render(Context(context))
  525. return render(request, self.template_name, context)
  526. def post(self, request):
  527. product_f = WohnprojektForm(request.POST, request.FILES)
  528. if product_f.is_valid():
  529. product = product_f.save(commit=False)
  530. product.contact = Contact.objects.get(user = self.request.user)
  531. product.edit=True
  532. product.public = False
  533. product.sumbitted = config.CURRENT_EVENT
  534. product.save( )
  535. # product_f.save_m2m()
  536. if 'addImage' in request.POST:
  537. return HttpResponseRedirect(reverse('add-Image', kwargs={'pk': product.pk}))
  538. return HttpResponseRedirect(reverse('my-products'))
  539. else:
  540. context = request.POST.dict()
  541. context['product'] = product_f
  542. context['product_errors'] = product_f.errors
  543. context['use_ajax'] = True
  544. return render(request, self.template_name, context)
  545. class uploadView(LoginRequiredMixin, FormView):
  546. use_ajax = True
  547. template_name = 'marktplatz/file_upload.html'
  548. def get(self, request, pk):
  549. user = self.request.user
  550. contact = Contact.objects.get(user=user)
  551. if not Product.objects.filter(contact=contact).filter(pk=pk).exists():
  552. raise Http404
  553. product = Product.objects.get(pk=pk)
  554. photo = product.media_set.count()
  555. video = product.video_set.count()
  556. context = request.GET.dict()
  557. contact = Contact.objects.get(user=self.request.user)
  558. product = get_object_or_404(Wohnprojekt, (Q(pk=pk) & Q(contact=contact)))
  559. context['product'] = product
  560. context['images'] = Media.objects.filter(product=product)
  561. context['video'] = Video.objects.filter(product=product)
  562. context['media'] = MediaForm
  563. context['media_count'] = False
  564. context['video_count'] = False
  565. if photo >= 7:
  566. context['media_count'] = True
  567. if video >= 2:
  568. context['video_count'] = True
  569. context['use_ajax'] = True
  570. context['warning'] = False
  571. return render(request, self.template_name, context)
  572. def post(self, request, pk):
  573. vid1_f = MediaForm(request.POST, request.FILES)
  574. product = Product.objects.get(pk=pk)
  575. i = product.media_set.count()
  576. i += product.video_set.count()
  577. video = product.video_set.count()
  578. photo = product.media_set.count()
  579. context = request.GET.dict()
  580. contact = Contact.objects.get(user=self.request.user)
  581. product = get_object_or_404(Product, (Q(pk=pk) & Q(contact=contact)))
  582. context['product'] = product
  583. context['images'] = Media.objects.filter(product=product)
  584. context['video'] = Video.objects.filter(product=product)
  585. context['media'] = MediaForm
  586. context['media_count'] = False
  587. context['video_count'] = False
  588. context['use_ajax'] = True
  589. context['warning'] = False
  590. if vid1_f.is_valid():
  591. image = vid1_f.cleaned_data['image']
  592. name = image.name
  593. if 'png' in name or 'jpg' in name or 'jpeg' in name:
  594. if photo < 7:
  595. vid1 = Media()
  596. vid1.product = product
  597. vid1.filename = name
  598. vid1.copyright = vid1_f.cleaned_data['copyright']
  599. vid1.name_for = vid1_f.cleaned_data['name_for']
  600. vid1.image.save(name, image)
  601. vid1.image_small.save(str(i) + '_small', image)
  602. vid1.image_medium.save(str(i) + '_medium', image)
  603. vid1.image_big.save(str(i) + '_big', image)
  604. vid1.image_norm.save(str(i) + '_norm', image)
  605. vid1.save
  606. photo += 1
  607. else:
  608. context['warning'] = "You can not upload any more photos!"
  609. elif 'mp4' in name or 'm3u8' in name or 'm4v' in name:
  610. if video < 2:
  611. #TODO clean image here!
  612. vid1 = Video()
  613. vid1.product = product
  614. vid1.filename = name
  615. vid1.copyright = vid1_f.cleaned_data['copyright']
  616. vid1.name_for = vid1_f.cleaned_data['name_for']
  617. vid1.image.save(name, image)
  618. vid1.save
  619. video += 1
  620. else:
  621. context['warning'] = "You can not upload any more videos!"
  622. vid1_f.delete_temporary_files()
  623. if photo >= 7:
  624. context['media_count'] = True
  625. if video >= 2:
  626. context['video_count'] = True
  627. return render(request, self.template_name, context)
  628. handle_upload = FileFormUploader()
  629. class EditView(LoginRequiredMixin, FormView):
  630. template_name = 'marktplatz/add.html'
  631. def get(self, request, pk):
  632. user = self.request.user
  633. contact = Contact.objects.get(user=user)
  634. if not Product.objects.filter(contact=contact).filter(pk=pk).exists():
  635. raise Http404
  636. context = request.GET.dict()
  637. context['product'] = WohnprojektForm(instance=Wohnprojekt.objects.get(pk=pk))
  638. context['use_ajax'] = True
  639. context['info_txt'] = Template(config.INFO_TXT).render(Context(context))
  640. return render(request, self.template_name, context)
  641. def post(self, request, pk):
  642. product_f = WohnprojektForm(request.POST, request.FILES, instance=Wohnprojekt.objects.get(pk=pk))
  643. if product_f.is_valid():
  644. if product_f.has_changed():
  645. product = product_f.save( commit=False )
  646. update_fields = product_f.changed_data
  647. product.current_uri = request.build_absolute_uri( '/' ).rstrip('/')
  648. product.save( update_fields=update_fields )
  649. # product.save( )
  650. if 'addImage' in request.POST:
  651. return HttpResponseRedirect(reverse('add-Image', kwargs={'pk': pk}))
  652. return HttpResponseRedirect(reverse('my-products'))
  653. else:
  654. context = request.GET.dict()
  655. context['product'] = product_f
  656. context['product_errors'] = product_f.errors
  657. context['use_ajax'] = True
  658. return render(request, self.template_name, context)
  659. class UsersProducts(LoginRequiredMixin, generic.ListView):
  660. model = Product
  661. template_name='marktplatz/myProducts.html'
  662. def get_queryset(self):
  663. contact = Contact.objects.get(user=self.request.user)
  664. return Product.objects.filter(contact=contact)
  665. def get_context_data(self, **kwargs):
  666. context = super().get_context_data(**kwargs)
  667. contact = Contact.objects.get(user=self.request.user)
  668. context['user'] = self.request.user
  669. return context
  670. class MediaView(LoginRequiredMixin, TemplateView):
  671. template_name = 'marktplatz/media_overview.html'
  672. def get(self, request, pk):
  673. self.user = self.request.user
  674. user= self.user
  675. contact = Contact.objects.get(user=user)
  676. if not Product.objects.filter(contact=contact).filter(pk=pk).exists():
  677. raise Http404
  678. context = request.GET.dict()
  679. contact = Contact.objects.get(user=self.request.user)
  680. product = get_object_or_404(Product, (Q(pk = pk) & Q(contact = contact)))
  681. context['product'] = product
  682. context['media'] = Media.objects.filter(product=product)
  683. context['video'] = Video.objects.filter(product=product)
  684. return render(request, self.template_name, context)
  685. def delete_media(request, pk):
  686. user = request.user
  687. contact = Contact.objects.get(user=user)
  688. object = Media.objects.get(id=pk)
  689. if not Product.objects.filter(contact=contact).filter(pk=object.product.pk).exists():
  690. raise Http404
  691. object.delete()
  692. return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/'))
  693. def delete_video(request, pk):
  694. user = request.user
  695. contact = Contact.objects.get(user=user)
  696. object = Video.objects.get(id=pk)
  697. if not Product.objects.filter(contact=contact).filter(pk=object.product.pk).exists():
  698. raise Http404
  699. object.delete()
  700. return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/'))