views.py 22 KB

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