views.py 23 KB

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