views.py 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707
  1. from django.shortcuts import render
  2. from django.views import generic
  3. from django.views.generic import TemplateView
  4. from django.views.generic.edit import *
  5. from marktplatz.models import *
  6. from django.db import models
  7. from django.contrib.auth.models import User
  8. from django.contrib.auth.mixins import LoginRequiredMixin
  9. from django.core import serializers
  10. from django.core.mail import send_mail
  11. from django.contrib.auth.decorators import login_required
  12. from django.contrib.auth.models import User, Group
  13. from django.http import HttpResponseRedirect
  14. from django.urls import reverse, reverse_lazy
  15. from django.core.files import File
  16. from django.http import HttpResponse
  17. from django.views.generic import FormView
  18. from django.shortcuts import get_object_or_404
  19. from django.contrib.auth import login, authenticate
  20. from django.shortcuts import render, redirect
  21. from django.forms import formset_factory
  22. from django.forms import BaseModelFormSet
  23. from django.forms import modelformset_factory, inlineformset_factory
  24. from django.forms.models import model_to_dict
  25. from django.contrib import messages
  26. from django_file_form.uploader import FileFormUploader
  27. from django_countries import countries
  28. from django.template import Context, Template
  29. from django.conf import settings
  30. from constance import config
  31. from django.http import Http404
  32. from django.db.models import Count
  33. from PIL import Image
  34. from PIL import ImageFont
  35. from PIL import ImageDraw
  36. from django.db.models import Q
  37. from django.shortcuts import get_list_or_404, get_object_or_404
  38. # from .forms import LinkFormSet, LinkForm, FormsetHelper, MediaFormsetHelper, MediaFormSet
  39. from .forms import *
  40. import itertools
  41. from PIL import Image
  42. import json
  43. import copy
  44. import csv
  45. # Create your views here.
  46. def index(request):
  47. context = {}
  48. return render(request, 'index.html', context = context)
  49. def about(request):
  50. context = {}
  51. context = {'about_text': Template(config.ABOUT_CONTENT).render(Context(context))}
  52. return render(request, 'marktplatz/about.html', context)
  53. #template = Template( config.ABOUT_CONTENT )
  54. #return HttpResponse( template.render( Context(context) ) )
  55. #return render(request, rendered , context = context)
  56. def submit(request):
  57. context = {}
  58. context = {'submit_text': Template(config.SUBMIT_TEXT).render(Context(context))}
  59. return render(request,'marktplatz/submit.html', context)
  60. def error_404_view(request, exception):
  61. data = {"name": "ThePythonDjango.com"}
  62. return render(request,'marktplatz/error_404.html', data)
  63. @login_required
  64. def home(request):
  65. user = request.user
  66. if user.groups.filter(name='submission').exists():
  67. return HttpResponseRedirect(reverse('my-products'))
  68. else:
  69. return HttpResponseRedirect(reverse('products'))
  70. class genericView(TemplateView):
  71. template_name = 'marktplatz/generic.html'
  72. def get(self, request, *args, **kwargs):
  73. instance = get_object_or_404(Wohnprojekt, pk=2 )
  74. context = {}
  75. context['object'] = model_to_dict ( instance )
  76. context['object']['myfield'] = '----------------------------'
  77. print (context)
  78. return render(request, self.template_name, context )
  79. class SearchAgentCreate(CreateView):
  80. model = SearchAgent
  81. template_name = 'marktplatz/form.html'
  82. fields = 'ort', 'email'
  83. success_url = reverse_lazy('generic')
  84. embed = False
  85. def get_context_data(self, **kwargs):
  86. if self.embed :
  87. kwargs['embed'] = True
  88. kwargs['form_content'] = '<i class="fas fa-bell"></i> Suchagent einrichten'
  89. kwargs['content_a'] = 'Sehr gut, Dein Suchagent wurde erstellt!'
  90. return super().get_context_data(**kwargs)
  91. def form_valid(self, form):
  92. super().form_valid(form)
  93. return render(self.request, 'marktplatz/generic.html',
  94. self.get_context_data(form=form))
  95. class SearchAgentDelete(DeleteView):
  96. model = SearchAgent
  97. template_name = 'marktplatz/form.html'
  98. success_url = reverse_lazy('products')
  99. def get(self, request, *args, **kwargs):
  100. searchagent = get_object_or_404(SearchAgent, pk= kwargs.get('pk') )
  101. context = {}
  102. context['form_content'] = 'Dein Suchagent wurde gelöscht!'
  103. if searchagent.hash == kwargs.get('hash'):
  104. if settings.DEBUG:
  105. return render(request, self.template_name, context )
  106. else:
  107. super().get(self, request, *args, **kwargs)
  108. else:
  109. context['form_content'] = 'Oopala, das hat nicht geklappt.'
  110. return render(request, self.template_name, context )
  111. class ProductsView(generic.ListView):
  112. model = Wohnprojekt
  113. #context_object_name = 'Products'
  114. # show the best 4 website finish
  115. def get_queryset(self):
  116. # original qs
  117. qs = super().get_queryset()
  118. self.user = self.request.user
  119. user = self.user
  120. # if user.groups.filter(name='jury').exists():
  121. # return qs.filter(sumbitted = config.CURRENT_EVENT)
  122. qs = qs.order_by('frei')
  123. if user.groups.filter(name='submission').exists():
  124. contact = Contact.objects.get(user=user)
  125. return qs.filter(contact = contact)
  126. if user.is_superuser:
  127. return qs
  128. return qs.filter(public = True)
  129. def get_context_data(self, **kwargs):
  130. context = super().get_context_data(**kwargs)
  131. user =self.request.user
  132. context['user'] = user
  133. used_countries = []
  134. orts = {}
  135. years = {''}
  136. for product in context['wohnprojekt_list']:
  137. if not years.__contains__(product.year):
  138. years.add(product.year)
  139. for country in product.country:
  140. if not used_countries.__contains__(country):
  141. used_countries.append(country)
  142. # if not used_orts.__contains__( product.get_ort_display() ):
  143. if not product.ort in orts:
  144. orts[product.ort] = product.get_ort_display()
  145. years.remove('')
  146. context['year_list'] = years
  147. context['count_list'] = used_countries
  148. context['frei_list'] = Product.FREI
  149. context['status_list'] = Product.STATUS
  150. context['ort_dict'] = orts
  151. context['altneu_list'] = Wohnprojekt.ALTNEU
  152. context['sponsor_cards'] = Template( config.SPONSOR_CARDS ).render( Context(context) )
  153. context['main_card'] = Template( config.MAIN_CARD ).render( Context(context) )
  154. return context
  155. template_name = 'marktplatz/product_overview.html'
  156. class DetailView(generic.DetailView):
  157. model = Product
  158. template_name = 'marktplatz/product_detail.html'
  159. embed = False
  160. def get_context_data(self, **kwargs):
  161. # context = super().get_context_data(**kwargs)
  162. if self.embed :
  163. kwargs['embed'] = True
  164. # context['credits'] = Credit.objects.select_related().get(product = self.kwargs['pk'])
  165. # context['wohnprojekt'] = self.object.wohnprojekt
  166. return super().get_context_data(**kwargs)
  167. def post(self, request, *args, **kwargs):
  168. vote = int(request.POST['vote'])
  169. comment = str(request.POST['comment'])
  170. if vote <= 10:
  171. try:
  172. get_vote = Vote.objects.get(juryMember=self.request.user, product=self.kwargs['pk'])
  173. get_vote.vote = vote
  174. get_vote.comment = comment
  175. get_vote.save()
  176. except Vote.DoesNotExist:
  177. get_vote = Vote(product = Product.objects.get(pk=self.kwargs['pk']), juryMember= self.request.user, vote = vote, comment=comment)
  178. get_vote.save()
  179. else:
  180. return HttpResponseRedirect(request.path)
  181. return HttpResponseRedirect(reverse('products'))
  182. class AdminView(LoginRequiredMixin, generic.ListView):
  183. model = Product
  184. template_name='marktplatz/admin_panel.html'
  185. def get_context_data(self, **kwargs):
  186. context = super().get_context_data(**kwargs)
  187. return context
  188. def post(self, request, *args, **kwargs):
  189. # print (request.POST.dict())
  190. context = request.POST.dict()
  191. public = {k: v for k, v in context.items() if k.startswith('product_p')}
  192. for elemk in public:
  193. # print(elemk + " - " + public[elemk] )
  194. keys = elemk.split(".")
  195. current_product = Product.objects.get(pk=keys[1])
  196. if public[elemk] == 'true':
  197. current_product.public = True
  198. current_product.save()
  199. else:
  200. current_product.public = False
  201. current_product.save()
  202. edit = {k: v for k, v in context.items() if k.startswith('product_e')}
  203. # print (edit)
  204. for elemk in edit:
  205. # print(elemk + " - " + edit[elemk] )
  206. keys = elemk.split(".")
  207. current_product = Product.objects.get(pk=keys[1])
  208. if edit[elemk] == 'true':
  209. current_product.edit = True
  210. current_product.save()
  211. else:
  212. current_product.edit = False
  213. current_product.save()
  214. return HttpResponseRedirect('')
  215. class lightboximg(LoginRequiredMixin, TemplateView):
  216. template_name = "marktplatz/importold.html"
  217. def post(self, request):
  218. context = {'faild': ''}
  219. faild = ''
  220. from1 = int(request.POST['from'])
  221. to = int(request.POST['to'])
  222. products = Product.objects.all()
  223. i = 0
  224. for product in products:
  225. i+=1
  226. if (i < from1):
  227. continue
  228. if (i > to):
  229. break
  230. medias = product.media_set.all()
  231. for oldmedia in medias:
  232. if not oldmedia.image_norm:
  233. oldpic = oldmedia.image
  234. oldmedia.image_norm.save(oldmedia.filename() + '_norm', oldpic)
  235. oldmedia.save
  236. return render(request, self.template_name, context)
  237. def get(self, request):
  238. context = {'faild': ''}
  239. faild = ''
  240. context['faild'] = faild
  241. return render(request, self.template_name, context)
  242. class registerView(FormView):
  243. template_name = 'marktplatz/form.html'
  244. #form_class = RegisterForm
  245. def get(self, request):
  246. #form = self.form_class()
  247. context = request.GET.dict()
  248. context['form'] = RegisterForm
  249. context['signUp'] = SignUpForm
  250. return render(request, self.template_name, context)
  251. def post(self, request):
  252. # print ( request.POST.dict() )
  253. form = SignUpForm(request.POST)
  254. form_contact = RegisterForm(request.POST)
  255. #
  256. # Filter existing emails
  257. #
  258. qs = Contact.objects.filter( email=form_contact.data['email'] )
  259. if ( qs.count() ):
  260. form_contact.add_error('email', "Email already in use, please reset your password.")
  261. if form.is_valid() and form_contact.is_valid():
  262. print (form.cleaned_data)
  263. print (form_contact.cleaned_data)
  264. contact = form_contact.save(commit=False)
  265. user = form.save()
  266. user.email = contact.email
  267. user.first_name = contact.first_name
  268. user.last_name = contact.last_name
  269. user.set_password(form.cleaned_data.get('password1'))
  270. user.save()
  271. contact.user = user
  272. contact.save()
  273. username = form.cleaned_data.get('username')
  274. raw_password = form.cleaned_data.get('password1')
  275. group = Group.objects.get(name='submission')
  276. group.user_set.add(user)
  277. user = authenticate(username=username, password=raw_password)
  278. if user is not None:
  279. # A backend authenticated the credentials
  280. login(request, user)
  281. return redirect('products')
  282. else:
  283. # No backend authenticated the credentials
  284. send_mail(
  285. 'error with auth',
  286. 'Error in authorization.' + json.dumps( request.POST.dict() ),
  287. 'awards@berta.mediaarchitecture.org',
  288. ['juan@mediaarchitecture.org'],
  289. fail_silently=False,
  290. )
  291. return redirect('products')
  292. login(request, user)
  293. else:
  294. print (form.errors)
  295. print (form_contact.errors)
  296. send_mail(
  297. 'error with auth',
  298. '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),
  299. 'awards@berta.mediaarchitecture.org',
  300. ['juan@mediaarchitecture.org'],
  301. fail_silently=False,
  302. )
  303. context = request.POST.dict()
  304. context['signUp'] = form
  305. context['form'] = form_contact
  306. context['signup_errors'] = form.errors
  307. context['contact_errors'] = form_contact.errors
  308. return render(request, self.template_name, context)
  309. context = request.GET.dict()
  310. context['form'] = RegisterForm
  311. context['signUp'] = SignUpForm
  312. return render(request, self.template_name, context)
  313. class NewProductView(LoginRequiredMixin, FormView):
  314. use_ajax = True
  315. template_name = 'marktplatz/add.html'
  316. model = Product
  317. class NewWohnprojektView(LoginRequiredMixin, FormView):
  318. use_ajax = True
  319. template_name = 'marktplatz/add.html'
  320. model = Product
  321. def get(self, request,*args, **kwargs):
  322. # form = self.form_class()
  323. context = request.GET.dict()
  324. context['product'] = WohnprojektForm
  325. # context['lnks'] = LinkFormSet
  326. # context['lnks_helper'] = FormsetHelper()
  327. context['use_ajax'] = True
  328. context['info_txt'] = Template(config.INFO_TXT).render(Context(context))
  329. return render(request, self.template_name, context)
  330. def post(self, request):
  331. product_f = WohnprojektForm(request.POST, request.FILES)
  332. if product_f.is_valid():
  333. product = product_f.save(commit=False)
  334. product.contact = Contact.objects.get(user = self.request.user)
  335. product.edit=True
  336. product.public = False
  337. product.sumbitted = config.CURRENT_EVENT
  338. product.save()
  339. # product_f.save_m2m()
  340. if 'addImage' in request.POST:
  341. return HttpResponseRedirect(reverse('add-Image', kwargs={'pk': product.pk}))
  342. return HttpResponseRedirect(reverse('my-products'))
  343. else:
  344. context = request.POST.dict()
  345. context['product'] = product_f
  346. context['product_errors'] = product_f.errors
  347. context['use_ajax'] = True
  348. return render(request, self.template_name, context)
  349. class uploadView(LoginRequiredMixin, FormView):
  350. use_ajax = True
  351. template_name = 'marktplatz/file_upload.html'
  352. def get(self, request, pk):
  353. user = self.request.user
  354. contact = Contact.objects.get(user=user)
  355. if not Product.objects.filter(contact=contact).filter(pk=pk).exists():
  356. raise Http404
  357. product = Product.objects.get(pk=pk)
  358. photo = product.media_set.count()
  359. video = product.video_set.count()
  360. context = request.GET.dict()
  361. contact = Contact.objects.get(user=self.request.user)
  362. product = get_object_or_404(Wohnprojekt, (Q(pk=pk) & Q(contact=contact)))
  363. context['product'] = product
  364. context['images'] = Media.objects.filter(product=product)
  365. context['video'] = Video.objects.filter(product=product)
  366. context['media'] = MediaForm
  367. context['media_count'] = False
  368. context['video_count'] = False
  369. if photo >= 7:
  370. context['media_count'] = True
  371. if video >= 2:
  372. context['video_count'] = True
  373. context['use_ajax'] = True
  374. context['warning'] = False
  375. return render(request, self.template_name, context)
  376. def post(self, request, pk):
  377. vid1_f = MediaForm(request.POST, request.FILES)
  378. product = Product.objects.get(pk=pk)
  379. i = product.media_set.count()
  380. i += product.video_set.count()
  381. video = product.video_set.count()
  382. photo = product.media_set.count()
  383. context = request.GET.dict()
  384. contact = Contact.objects.get(user=self.request.user)
  385. product = get_object_or_404(Product, (Q(pk=pk) & Q(contact=contact)))
  386. context['product'] = product
  387. context['images'] = Media.objects.filter(product=product)
  388. context['video'] = Video.objects.filter(product=product)
  389. context['media'] = MediaForm
  390. context['media_count'] = False
  391. context['video_count'] = False
  392. context['use_ajax'] = True
  393. context['warning'] = False
  394. if vid1_f.is_valid():
  395. image = vid1_f.cleaned_data['image']
  396. name = image.name
  397. if 'png' in name or 'jpg' in name or 'jpeg' in name:
  398. if photo < 7:
  399. vid1 = Media()
  400. vid1.product = product
  401. vid1.filename = name
  402. vid1.copyright = vid1_f.cleaned_data['copyright']
  403. vid1.name_for = vid1_f.cleaned_data['name_for']
  404. vid1.image.save(name, image)
  405. vid1.image_small.save(str(i) + '_small', image)
  406. vid1.image_medium.save(str(i) + '_medium', image)
  407. vid1.image_big.save(str(i) + '_big', image)
  408. vid1.image_norm.save(str(i) + '_norm', image)
  409. vid1.save
  410. photo += 1
  411. else:
  412. context['warning'] = "You can not upload any more photos!"
  413. elif 'mp4' in name or 'm3u8' in name or 'm4v' in name:
  414. if video < 2:
  415. #TODO clean image here!
  416. vid1 = Video()
  417. vid1.product = product
  418. vid1.filename = name
  419. vid1.copyright = vid1_f.cleaned_data['copyright']
  420. vid1.name_for = vid1_f.cleaned_data['name_for']
  421. vid1.image.save(name, image)
  422. vid1.save
  423. video += 1
  424. else:
  425. context['warning'] = "You can not upload any more videos!"
  426. vid1_f.delete_temporary_files()
  427. if photo >= 7:
  428. context['media_count'] = True
  429. if video >= 2:
  430. context['video_count'] = True
  431. return render(request, self.template_name, context)
  432. handle_upload = FileFormUploader()
  433. class EditView(LoginRequiredMixin, FormView):
  434. template_name = 'marktplatz/add.html'
  435. def get(self, request, pk):
  436. user = self.request.user
  437. contact = Contact.objects.get(user=user)
  438. if not Product.objects.filter(contact=contact).filter(pk=pk).exists():
  439. raise Http404
  440. context = request.GET.dict()
  441. context['product'] = WohnprojektForm(instance=Wohnprojekt.objects.get(pk=pk))
  442. # linkFormSet = inlineformset_factory(Product,Link, form=LinkForm, extra=0)
  443. # myLinkFormSet = linkFormSet(instance= Product.objects.get(pk=pk) )
  444. # context['lnks'] = myLinkFormSet
  445. # context['lnks_helper'] = FormsetHelper()
  446. context['use_ajax'] = True
  447. context['info_txt'] = Template(config.INFO_TXT).render(Context(context))
  448. return render(request, self.template_name, context)
  449. def post(self, request, pk):
  450. # print ( request.POST.dict() )
  451. # https://stackoverflow.com/questions/35879101/how-to-determine-if-a-field-has-changed-in-a-django-modelform/43550210
  452. # print ('product_f.changed_data: ', product_f.changed_data)
  453. product_f = WohnprojektForm(request.POST, request.FILES, instance=Wohnprojekt.objects.get(pk=pk))
  454. if product_f.is_valid():
  455. if product_f.has_changed():
  456. product = product_f.save( commit=False )
  457. update_fields = product_f.changed_data
  458. product.current_uri = request.build_absolute_uri( '/' ).rstrip('/')
  459. product.save( update_fields=update_fields )
  460. if 'addImage' in request.POST:
  461. return HttpResponseRedirect(reverse('add-Image', kwargs={'pk': pk}))
  462. return HttpResponseRedirect(reverse('my-products'))
  463. else:
  464. print( "not saved xxxxxxx" )
  465. context = request.GET.dict()
  466. context['product'] = product_f
  467. context['product_errors'] = product_f.errors
  468. # context['lnks'] = lnks_f
  469. # context['lnks_helper'] = FormsetHelper()
  470. context['use_ajax'] = True
  471. return render(request, self.template_name, context)
  472. class UsersProducts(LoginRequiredMixin, generic.ListView):
  473. model = Product
  474. template_name='marktplatz/myProducts.html'
  475. def get_queryset(self):
  476. contact = Contact.objects.get(user=self.request.user)
  477. return Product.objects.filter(contact=contact)
  478. def get_context_data(self, **kwargs):
  479. context = super().get_context_data(**kwargs)
  480. contact = Contact.objects.get(user=self.request.user)
  481. context['user'] = self.request.user
  482. return context
  483. class MediaView(LoginRequiredMixin, TemplateView):
  484. template_name = 'marktplatz/media_overview.html'
  485. def get(self, request, pk):
  486. self.user = self.request.user
  487. user= self.user
  488. contact = Contact.objects.get(user=user)
  489. if not Product.objects.filter(contact=contact).filter(pk=pk).exists():
  490. raise Http404
  491. context = request.GET.dict()
  492. contact = Contact.objects.get(user=self.request.user)
  493. product = get_object_or_404(Product, (Q(pk = pk) & Q(contact = contact)))
  494. context['product'] = product
  495. context['media'] = Media.objects.filter(product=product)
  496. context['video'] = Video.objects.filter(product=product)
  497. return render(request, self.template_name, context)
  498. def delete_media(request, pk):
  499. user = request.user
  500. contact = Contact.objects.get(user=user)
  501. object = Media.objects.get(id=pk)
  502. if not Product.objects.filter(contact=contact).filter(pk=object.product.pk).exists():
  503. raise Http404
  504. object.delete()
  505. return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/'))
  506. def delete_video(request, pk):
  507. user = request.user
  508. contact = Contact.objects.get(user=user)
  509. object = Video.objects.get(id=pk)
  510. if not Product.objects.filter(contact=contact).filter(pk=object.product.pk).exists():
  511. raise Http404
  512. object.delete()
  513. return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/'))