views.py 22 KB

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