From c2eede9500bfb90c37b016f3d82b063e4c9182f6 Mon Sep 17 00:00:00 2001 From: Martin Bley Date: Fri, 17 Jun 2016 22:37:43 +0200 Subject: [PATCH] Implemented mandant based blog posts --- templates/newblogpost.html | 31 ++++++++++--- tipp/admin.py | 3 +- tipp/forms.py | 9 +++- tipp/models.py | 9 +++- tipp/views.py | 94 +++++++++++++++++++++----------------- 5 files changed, 93 insertions(+), 53 deletions(-) diff --git a/templates/newblogpost.html b/templates/newblogpost.html index 2df5610..3e66c21 100644 --- a/templates/newblogpost.html +++ b/templates/newblogpost.html @@ -10,10 +10,10 @@ {% block body %}
- {% if form.errors %} + {% if form_bp.errors %}

- {% if form.errors.items|length == 1 %} + {% if form_bp.errors.items|length == 1 %} {% trans "Please correct the error below." %} {% else %} {% trans "Please correct the errors below." %} @@ -22,21 +22,38 @@ {% endif %}

-
{% csrf_token %} + + {% csrf_token %}
- {{form.content.errors}} - + {{form_bp.content.errors}} +
- + + {% if has_choices %} + {{ form_mandants }} + {% endif %}
- +
+ {% if debug %} +
+
+ + {{ debug }} +
+
+ {% endif %}
{% endblock %} diff --git a/tipp/admin.py b/tipp/admin.py index 2e054b2..f3f1311 100644 --- a/tipp/admin.py +++ b/tipp/admin.py @@ -18,7 +18,7 @@ You should have received a copy of the GNU General Public License along with TipPy. If not, see . """ -from tipp.models import Team, Match, Tipp, Score, Mandant, RelUserMandant, Competition, Post, UserProfile +from tipp.models import * from django.contrib import admin class PostAdmin(admin.ModelAdmin): @@ -41,4 +41,5 @@ admin.site.register(Score) admin.site.register(RelUserMandant) admin.site.register(Competition) admin.site.register(Post, PostAdmin) +admin.site.register(RelPostMandant) diff --git a/tipp/forms.py b/tipp/forms.py index 6102244..63afa76 100644 --- a/tipp/forms.py +++ b/tipp/forms.py @@ -22,7 +22,7 @@ from django import forms from django.forms import ModelForm from django.contrib.auth.models import User from django.core.files.images import get_image_dimensions -from tipp.models import Match, Competition, Post, UserProfile +from tipp.models import Match, Competition, Post, UserProfile, Mandant, RelUserMandant class NumberInput(forms.TextInput): input_type = 'number' @@ -48,6 +48,13 @@ class BlogpostForm(ModelForm): model = Post fields = ['content'] +class MandantsForm(forms.Form): + mandants = forms.MultipleChoiceField( + label= "Mandanten", + widget=forms.CheckboxSelectMultiple() + ) + + class UserForm(forms.ModelForm): class Meta: model = User diff --git a/tipp/models.py b/tipp/models.py index 38262cd..f51da43 100644 --- a/tipp/models.py +++ b/tipp/models.py @@ -123,7 +123,6 @@ class Post(models.Model): published = models.BooleanField(default=True) created = models.DateTimeField(auto_now_add=True) author = models.ForeignKey(User) - mandant = models.ForeignKey(Mandant) class Meta: ordering = ['-created'] @@ -131,4 +130,12 @@ class Post(models.Model): def __unicode__(self): return u'%s' % self.created +class RelPostMandant(models.Model): + post = models.ForeignKey(Post) + mandant = models.ForeignKey(Mandant) + + class Meta: + unique_together = ("post", "mandant") + def __unicode__(self): + return (str(self.post) + " -> " + str(self.mandant)) diff --git a/tipp/views.py b/tipp/views.py index 88f8507..a77c9c7 100644 --- a/tipp/views.py +++ b/tipp/views.py @@ -72,7 +72,6 @@ def profile(request, pk): debug = [] debug.append('avatar: ' + str(img)) - # If it's a HTTP POST, we're interested in processing form data. if request.method == 'POST': user_form = UserForm(data=request.POST, instance=user) profile_form = UserProfileForm(data=request.POST, instance=profile) @@ -84,10 +83,8 @@ def profile(request, pk): profile = profile_form.save(commit=False) profile.user = user - # Did the user provide a profile picture? if 'avatar' in request.FILES: profile.avatar = request.FILES['avatar'] - # Now we save the UserProfile model instance. profile.save() # create thumbnail @@ -106,16 +103,11 @@ def profile(request, pk): for item in request.POST: debug.append(str(item) + " -> " + str(request.POST[item])) - # Invalid form or forms - mistakes or something else? - # Print problems to the terminal. - # They'll also be shown to the user. else: print user_form.errors, profile_form.errors return redirect( '/accounts/profile/' + str(user.id) ) - # Not a HTTP POST, so we render our form using two ModelForm instances. - # These forms will be blank, ready for user input. else: user_form = UserForm( initial={ 'last_name': user.last_name, @@ -398,8 +390,9 @@ def matchday(request, ls, season, matchday, template_name='md.html'): matches.append(item) # get the newest blogposts + pIDs = RelPostMandant.objects.filter(mandant__in=mandants).values_list('post', flat=True) posts = [] - for post in Post.objects.filter(published=True)[:1]: + for post in Post.objects.filter(published=True, id__in=pIDs)[:1]: try: avatar = UserProfile.objects.get(user_id=post.author_id).avatar.name except: @@ -478,8 +471,13 @@ def charts(request, ls, season, pos='default', template_name='charts.html'): @login_required def blogindex(request, page): # get the blog posts that are published + # and related to mandant + + mandants = RelUserMandant.objects.filter(user=request.user).values_list('mandant', flat=True) + posts = RelPostMandant.objects.filter(mandant__in=mandants).values_list('post', flat=True) + post_list = [] - for post in Post.objects.filter(published=True): + for post in Post.objects.filter(published=True, id__in=posts): try: avatar = UserProfile.objects.get(user_id=post.author_id).avatar.name except: @@ -507,52 +505,62 @@ def blogindex(request, page): @login_required def newBlogpost(request): - """ - if this is a POST request we need to process the form data - """ - if request.method == 'POST': - # create form instance and populate it with data from the request - form = BlogpostForm(request.POST) - # check whether it's valid: - if form.is_valid(): - data = form.cleaned_data - p = Post(author_id=request.user.id, content=data['content']) + debug = '' + ms = Mandant.objects.filter( + id__in=RelUserMandant.objects.filter(user=request.user).values_list('mandant', flat=True) + ) + choices = [] + for m in ms: + choices.append((m.name, m.description)) + + has_choices = False + if ms.count() > 1: + has_choices = True + + if request.method == "POST": + form_bp = BlogpostForm(request.POST) + + if form_bp.is_valid(): + p = Post(author_id=request.user.id, content=form_bp.cleaned_data['content']) p.save() - # ... - # redirect to a new URL: - return redirect( '/blog/1') + if has_choices is True: + form_mandant = MandantsForm(request.POST) + form_mandant.fields["mandants"].choices = choices - # if a GET (or any other method) we'll create a blank form - else: - blogpostForm = BlogpostForm() - return render(request, 'newblogpost.html', { - 'form': blogpostForm, - 'ls': get_current_ls(), - 'season': get_current_season() - }) + if form_mandant.is_valid(): + for m in form_mandant.cleaned_data['mandants']: + r = RelPostMandant(mandant=Mandant.objects.get(name=m), post=p) + r.save() + else: + r = RelPostMandant(mandant=Mandant.objects.get(name=ms[0]), post=p) + r.save() + + return redirect( '/blog/1') + + blogpostForm = BlogpostForm() + form_mandant = MandantsForm() + form_mandant.fields["mandants"].choices = choices + + return render(request, 'newblogpost.html', { + #'debug': debug, + 'form_bp': blogpostForm, + 'form_mandants': form_mandant.as_table(), + 'has_choices': has_choices, + 'ls': get_current_ls(), + 'season': get_current_season() + }) def logout(request): - """ - Log users out and re-direct them to the main page. - """ logout(request) return HttpResponseRedirect('/') def get_current_md(ls): - """ - get current matchday() - returns dict with keys - ['groupName'] - ['groupOrderID'] - ['groupID'] - """ - try: ol = OpenLiga() cur_md = ol.getCurrentGroup(ls) except: - cur_md = {'groupName': u"1. Spieltag", 'groupOrderID': 1} + cur_md = 1 return(cur_md['groupOrderID'])