views.py 33 KB

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