from django.shortcuts import render from django.views import generic from django.views.generic import TemplateView from django.views.generic.edit import * from marktplatz.models import * from django.db import models from django.contrib.auth.models import User from django.contrib.auth.mixins import LoginRequiredMixin from django.core import serializers from django.core.mail import send_mail from django.contrib.auth.decorators import login_required from django.contrib.auth.models import User, Group from django.http import HttpResponseRedirect from django.urls import reverse, reverse_lazy from django.core.files import File from django.http import HttpResponse from django.views.generic import FormView from django.shortcuts import get_object_or_404 from django.contrib.auth import login, authenticate from django.shortcuts import render, redirect from django.forms import formset_factory from django.forms import BaseModelFormSet from django.forms import modelformset_factory, inlineformset_factory from .forms import LinkFormSet, LinkForm, FormsetHelper, MediaFormsetHelper, MediaFormSet from django.contrib import messages from django_file_form.uploader import FileFormUploader from django_countries import countries from django.template import Context, Template from django.conf import settings from constance import config from django.http import Http404 from django.db.models import Count from PIL import Image from PIL import ImageFont from PIL import ImageDraw from django.db.models import Q from django.shortcuts import get_list_or_404, get_object_or_404 from .forms import RegisterForm, SignUpForm, DescriptionForm,SubmissionForm,CreditForm,DescriptionForm,InteractionForm,LinkForm,MediaForm,VideoForm, MediaForm_test, MediaForm1, MediaForm2 import os import itertools from PIL import Image import json import copy import csv # Create your views here. def index(request): context = {} return render(request, 'index.html', context = context) def about(request): context = {} context = {'about_text': Template(config.ABOUT_CONTENT).render(Context(context))} return render(request, 'marktplatz/about.html', context) #template = Template( config.ABOUT_CONTENT ) #return HttpResponse( template.render( Context(context) ) ) #return render(request, rendered , context = context) def submit(request): context = {} context = {'submit_text': Template(config.SUBMIT_TEXT).render(Context(context))} return render(request,'marktplatz/submit.html', context) def error_404_view(request, exception): data = {"name": "ThePythonDjango.com"} return render(request,'marktplatz/error_404.html', data) @login_required def home(request): user = request.user if user.groups.filter(name='submission').exists(): return HttpResponseRedirect(reverse('my-products')) else: return HttpResponseRedirect(reverse('products')) class SearchAgentCreate(CreateView): model = SearchAgent template_name = 'marktplatz/form.html' fields = 'ort', 'email' success_url = reverse_lazy('products') class SearchAgentDelete(DeleteView): model = SearchAgent template_name = 'marktplatz/form.html' success_url = reverse_lazy('products') def get(self, request, *args, **kwargs): searchagent = get_object_or_404(SearchAgent, pk= kwargs.get('pk') ) context = {} context['form_content'] = 'Dein Suchagent wurde gelöscht!' if searchagent.hash == kwargs.get('hash'): if settings.DEBUG: return render(request, self.template_name, context ) else: super().get(self, request, *args, **kwargs) else: context['form_content'] = 'Oopala, das hat nicht geklappt.' return render(request, self.template_name, context ) class ProductsView(generic.ListView): model = Wohnprojekt #context_object_name = 'Products' # show the best 4 website finish def get_queryset(self): # original qs qs = super().get_queryset() self.user = self.request.user user = self.user # if user.groups.filter(name='jury').exists(): # return qs.filter(sumbitted = config.CURRENT_EVENT) qs = qs.order_by('frei') if user.groups.filter(name='submission').exists(): contact = Contact.objects.get(user=user) return qs.filter(contact = contact) if user.is_superuser: return qs return qs.filter(public = True) def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) user =self.request.user context['user'] = user used_countries = [] orts = {} years = {''} for product in context['wohnprojekt_list']: if not years.__contains__(product.year): years.add(product.year) for country in product.country: if not used_countries.__contains__(country): used_countries.append(country) # if not used_orts.__contains__( product.get_ort_display() ): if not product.ort in orts: orts[product.ort] = product.get_ort_display() years.remove('') context['year_list'] = years context['count_list'] = used_countries context['frei_list'] = Product.FREI context['status_list'] = Product.STATUS context['ort_dict'] = orts context['altneu_list'] = Wohnprojekt.ALTNEU context['sponsor_cards'] = Template( config.SPONSOR_CARDS ).render( Context(context) ) context['main_card'] = Template( config.MAIN_CARD ).render( Context(context) ) return context template_name = 'marktplatz/product_overview.html' class DetailView(generic.DetailView): model = Product template_name = 'marktplatz/product_detail.html' embed = False def get_context_data(self, **kwargs): # context = super().get_context_data(**kwargs) if self.embed : kwargs['embed'] = True # context['credits'] = Credit.objects.select_related().get(product = self.kwargs['pk']) # context['descriptions'] = Description.objects.select_related().get(product = self.kwargs['pk']) # context['interactions'] = Interaction.objects.select_related().get(product=self.kwargs['pk']) # context['PAUI'] = Category.objects.get(short_name='PAUI') # context['wohnprojekt'] = self.object.wohnprojekt # print (context) # print (context['object']) # print (context['product']) return super().get_context_data(**kwargs) def post(self, request, *args, **kwargs): vote = int(request.POST['vote']) comment = str(request.POST['comment']) if vote <= 10: try: get_vote = Vote.objects.get(juryMember=self.request.user, product=self.kwargs['pk']) get_vote.vote = vote get_vote.comment = comment get_vote.save() except Vote.DoesNotExist: get_vote = Vote(product = Product.objects.get(pk=self.kwargs['pk']), juryMember= self.request.user, vote = vote, comment=comment) get_vote.save() else: return HttpResponseRedirect(request.path) return HttpResponseRedirect(reverse('products')) class AdminView(LoginRequiredMixin, generic.ListView): model = Product template_name='marktplatz/admin_panel.html' def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) return context def post(self, request, *args, **kwargs): # print (request.POST.dict()) context = request.POST.dict() public = {k: v for k, v in context.items() if k.startswith('product_p')} for elemk in public: # print(elemk + " - " + public[elemk] ) keys = elemk.split(".") current_product = Product.objects.get(pk=keys[1]) if public[elemk] == 'true': current_product.public = True current_product.save() else: current_product.public = False current_product.save() edit = {k: v for k, v in context.items() if k.startswith('product_e')} # print (edit) for elemk in edit: # print(elemk + " - " + edit[elemk] ) keys = elemk.split(".") current_product = Product.objects.get(pk=keys[1]) if edit[elemk] == 'true': current_product.edit = True current_product.save() else: current_product.edit = False current_product.save() return HttpResponseRedirect('') class lightboximg(LoginRequiredMixin, TemplateView): template_name = "marktplatz/importold.html" def post(self, request): context = {'faild': ''} faild = '' from1 = int(request.POST['from']) to = int(request.POST['to']) products = Product.objects.all() i = 0 for product in products: i+=1 if (i < from1): continue if (i > to): break medias = product.media_set.all() for oldmedia in medias: if not oldmedia.image_norm: oldpic = oldmedia.image oldmedia.image_norm.save(oldmedia.filename() + '_norm', oldpic) oldmedia.save return render(request, self.template_name, context) def get(self, request): context = {'faild': ''} faild = '' context['faild'] = faild return render(request, self.template_name, context) class registerView(FormView): template_name = 'marktplatz/form.html' #form_class = RegisterForm def get(self, request): #form = self.form_class() context = request.GET.dict() context['form'] = RegisterForm context['signUp'] = SignUpForm return render(request, self.template_name, context) def post(self, request): # print ( request.POST.dict() ) form = SignUpForm(request.POST) form_contact = RegisterForm(request.POST) # # Filter existing emails # qs = Contact.objects.filter( email=form_contact.data['email'] ) if ( qs.count() ): form_contact.add_error('email', "Email already in use, please reset your password.") if form.is_valid() and form_contact.is_valid(): print (form.cleaned_data) print (form_contact.cleaned_data) contact = form_contact.save(commit=False) user = form.save() user.email = contact.email user.first_name = contact.first_name user.last_name = contact.last_name user.set_password(form.cleaned_data.get('password1')) user.save() contact.user = user contact.save() username = form.cleaned_data.get('username') raw_password = form.cleaned_data.get('password1') group = Group.objects.get(name='submission') group.user_set.add(user) user = authenticate(username=username, password=raw_password) if user is not None: # A backend authenticated the credentials login(request, user) return redirect('products') else: # No backend authenticated the credentials send_mail( 'error with auth', 'Error in authorization.' + json.dumps( request.POST.dict() ), 'awards@berta.mediaarchitecture.org', ['juan@mediaarchitecture.org'], fail_silently=False, ) return redirect('products') login(request, user) else: print (form.errors) print (form_contact.errors) send_mail( 'error with auth', '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), 'awards@berta.mediaarchitecture.org', ['juan@mediaarchitecture.org'], fail_silently=False, ) context = request.POST.dict() context['signUp'] = form context['form'] = form_contact context['signup_errors'] = form.errors context['contact_errors'] = form_contact.errors return render(request, self.template_name, context) context = request.GET.dict() context['form'] = RegisterForm context['signUp'] = SignUpForm return render(request, self.template_name, context) class NewSubmitView(LoginRequiredMixin, FormView): use_ajax = True template_name = 'marktplatz/add.html' model = Product def get(self, request,*args, **kwargs): # form = self.form_class() context = request.GET.dict() context['product'] = SubmissionForm # context['lnks'] = LinkFormSet # context['lnks_helper'] = FormsetHelper() context['use_ajax'] = True context['info_txt'] = Template(config.INFO_TXT).render(Context(context)) return render(request, self.template_name, context) def post(self, request): product_f = SubmissionForm(request.POST, request.FILES) if product_f.is_valid(): product = product_f.save(commit=False) product.contact = Contact.objects.get(user = self.request.user) product.edit=True product.public = False product.sumbitted = config.CURRENT_EVENT product.save() product_f.save_m2m() if 'addImage' in request.POST: return HttpResponseRedirect(reverse('add-Image', kwargs={'pk': product.pk})) return HttpResponseRedirect(reverse('my-products')) else: context = request.POST.dict() context['product'] = product_f context['product_errors'] = product_f.errors context['use_ajax'] = True return render(request, self.template_name, context) class uploadView(LoginRequiredMixin, FormView): use_ajax = True template_name = 'marktplatz/file_upload.html' def get(self, request, pk): user = self.request.user contact = Contact.objects.get(user=user) if not Product.objects.filter(contact=contact).filter(pk=pk).exists(): raise Http404 product = Product.objects.get(pk=pk) photo = product.media_set.count() video = product.video_set.count() context = request.GET.dict() contact = Contact.objects.get(user=self.request.user) product = get_object_or_404(Wohnprojekt, (Q(pk=pk) & Q(contact=contact))) context['product'] = product context['images'] = Media.objects.filter(product=product) context['video'] = Video.objects.filter(product=product) context['media'] = MediaForm context['media_count'] = False context['video_count'] = False if photo >= 7: context['media_count'] = True if video >= 2: context['video_count'] = True context['use_ajax'] = True context['warning'] = False return render(request, self.template_name, context) def post(self, request, pk): vid1_f = MediaForm(request.POST, request.FILES) product = Product.objects.get(pk=pk) i = product.media_set.count() i += product.video_set.count() video = product.video_set.count() photo = product.media_set.count() context = request.GET.dict() contact = Contact.objects.get(user=self.request.user) product = get_object_or_404(Product, (Q(pk=pk) & Q(contact=contact))) context['product'] = product context['images'] = Media.objects.filter(product=product) context['video'] = Video.objects.filter(product=product) context['media'] = MediaForm context['media_count'] = False context['video_count'] = False context['use_ajax'] = True context['warning'] = False if vid1_f.is_valid(): image = vid1_f.cleaned_data['image'] name = image.name if 'png' in name or 'jpg' in name or 'jpeg' in name: if photo < 7: vid1 = Media() vid1.product = product vid1.filename = name vid1.copyright = vid1_f.cleaned_data['copyright'] vid1.name_for = vid1_f.cleaned_data['name_for'] vid1.image.save(name, image) vid1.image_small.save(str(i) + '_small', image) vid1.image_medium.save(str(i) + '_medium', image) vid1.image_big.save(str(i) + '_big', image) vid1.image_norm.save(str(i) + '_norm', image) vid1.save photo += 1 else: context['warning'] = "You can not upload any more photos!" elif 'mp4' in name or 'm3u8' in name or 'm4v' in name: if video < 2: #TODO clean image here! vid1 = Video() vid1.product = product vid1.filename = name vid1.copyright = vid1_f.cleaned_data['copyright'] vid1.name_for = vid1_f.cleaned_data['name_for'] vid1.image.save(name, image) vid1.save video += 1 else: context['warning'] = "You can not upload any more videos!" vid1_f.delete_temporary_files() if photo >= 7: context['media_count'] = True if video >= 2: context['video_count'] = True return render(request, self.template_name, context) handle_upload = FileFormUploader() class EditView(FormView): template_name = 'marktplatz/add.html' def get(self, request, pk): user = self.request.user contact = Contact.objects.get(user=user) if not Product.objects.filter(contact=contact).filter(pk=pk).exists(): raise Http404 context = request.GET.dict() context['product'] = SubmissionForm(instance=Wohnprojekt.objects.get(pk=pk)) linkFormSet = inlineformset_factory(Product,Link, form=LinkForm, extra=0) myLinkFormSet = linkFormSet(instance= Product.objects.get(pk=pk) ) context['lnks'] = myLinkFormSet context['lnks_helper'] = FormsetHelper() context['use_ajax'] = True context['info_txt'] = Template(config.INFO_TXT).render(Context(context)) return render(request, self.template_name, context) def post(self, request, pk): # print ( request.POST.dict() ) product_f = SubmissionForm(request.POST, request.FILES, instance=Wohnprojekt.objects.get(pk=pk)) if product_f.is_valid(): # https://stackoverflow.com/questions/35879101/how-to-determine-if-a-field-has-changed-in-a-django-modelform/43550210 if product_f.has_changed(): update_fields = product_f.changed_data product = product_f.save( commit=False ) print ('product_f.changed_data: ', product_f.changed_data) product.save( update_fields=update_fields ) # product = product_f.save() # for lnk in lnks_f: # if lnk.is_valid(): # print( "link valid ......................." ) # lnk_ = lnk.save(commit=False) # lnk_.product = product # lnk_.save() if 'addImage' in request.POST: return HttpResponseRedirect(reverse('add-Image', kwargs={'pk': pk})) return HttpResponseRedirect(reverse('my-products')) else: print( "not saved xxxxxxx" ) context = request.GET.dict() context['product'] = product_f context['product_errors'] = product_f.errors # context['lnks'] = lnks_f # context['lnks_helper'] = FormsetHelper() context['use_ajax'] = True return render(request, self.template_name, context) class UsersProducts(LoginRequiredMixin, generic.ListView): model = Product template_name='marktplatz/myProducts.html' def get_queryset(self): contact = Contact.objects.get(user=self.request.user) return Product.objects.filter(contact=contact) def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) contact = Contact.objects.get(user=self.request.user) context['user'] = self.request.user return context class MediaView(LoginRequiredMixin, TemplateView): template_name = 'marktplatz/media_overview.html' def get(self, request, pk): self.user = self.request.user user= self.user contact = Contact.objects.get(user=user) if not Product.objects.filter(contact=contact).filter(pk=pk).exists(): raise Http404 context = request.GET.dict() contact = Contact.objects.get(user=self.request.user) product = get_object_or_404(Product, (Q(pk = pk) & Q(contact = contact))) context['product'] = product context['media'] = Media.objects.filter(product=product) context['video'] = Video.objects.filter(product=product) return render(request, self.template_name, context) def delete_media(request, pk): user = request.user contact = Contact.objects.get(user=user) object = Media.objects.get(id=pk) if not Product.objects.filter(contact=contact).filter(pk=object.product.pk).exists(): raise Http404 object.delete() return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/')) def delete_video(request, pk): user = request.user contact = Contact.objects.get(user=user) object = Video.objects.get(id=pk) if not Product.objects.filter(contact=contact).filter(pk=object.product.pk).exists(): raise Http404 object.delete() return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/'))