views.py 32 KB

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