From ecbcad607b08f8e8b3f3d55f40b4ce8f5ce967ad Mon Sep 17 00:00:00 2001 From: Nick Sergeant Date: Sun, 18 Oct 2015 11:52:44 -0400 Subject: [PATCH] Let team members save team-snipts, and record last user. --- accounts/models.py | 1 + media/js/src/modules/snipt.js | 6 +++++- snipts/api.py | 19 ++++++++++++----- .../migrations/0003_snipt_last_user_saved.py | 21 +++++++++++++++++++ snipts/models.py | 12 +++++++++-- snipts/templates/snipts/snipt-list.html | 12 ++++++----- snipts/templatetags/snipt_tags.py | 5 +++++ snipts/views.py | 3 ++- teams/models.py | 2 +- 9 files changed, 66 insertions(+), 15 deletions(-) create mode 100644 snipts/migrations/0003_snipt_last_user_saved.py diff --git a/accounts/models.py b/accounts/models.py index 0266349..b9cd09b 100644 --- a/accounts/models.py +++ b/accounts/models.py @@ -113,6 +113,7 @@ class UserProfile(models.Model): public=True).count() > 0 \ else False + @property def is_a_team(self): return True if get_object_or_None(Team, user=self.user) else False diff --git a/media/js/src/modules/snipt.js b/media/js/src/modules/snipt.js index 45dc54d..ae7c83e 100644 --- a/media/js/src/modules/snipt.js +++ b/media/js/src/modules/snipt.js @@ -491,7 +491,11 @@ window.site.$main_edit).removeAttr('disabled'); }, error: function(model, response) { - alert(JSON.stringify(response.responseJSON.snipt)); + if (response.responseJSON) { + alert(JSON.stringify(response.responseJSON.snipt)); + } else { + alert(JSON.stringify(response.statusText)); + } } }); }, diff --git a/snipts/api.py b/snipts/api.py index 2b522dd..dea9050 100644 --- a/snipts/api.py +++ b/snipts/api.py @@ -56,7 +56,7 @@ class PrivateSniptAuthorization(Authorization): return object_list.filter(user=bundle.request.user) def read_detail(self, object_list, bundle): - return bundle.obj.user == bundle.request.user + return bundle.obj.is_authorized_user(bundle.request.user) def create_list(self, object_list, bundle): raise Unauthorized() @@ -68,7 +68,7 @@ class PrivateSniptAuthorization(Authorization): raise Unauthorized() def update_detail(self, object_list, bundle): - return bundle.obj.user == bundle.request.user + return bundle.obj.is_authorized_user(bundle.request.user) def delete_list(self, object_list, bundle): raise Unauthorized() @@ -359,6 +359,7 @@ class PrivateUserResource(ModelResource): class PrivateSniptResource(ModelResource): user = fields.ForeignKey(PrivateUserResource, 'user', full=True) + last_user_saved = fields.ForeignKey(PrivateUserResource, 'last_user_saved', full=False) tags_list = ListField() class Meta: @@ -419,7 +420,16 @@ class PrivateSniptResource(ModelResource): user=bundle.request.user, **kwargs) def obj_update(self, bundle, **kwargs): - bundle.data['user'] = bundle.request.user + + instance = Snipt.objects.get(pk=bundle.data['id']) + + if (instance.user.profile.is_a_team): + user = instance.user + else: + user = bundle.request.user + + bundle.data['last_user_saved'] = bundle.request.user + bundle.data['user'] = user bundle.data['created'] = None bundle.data['modified'] = None @@ -433,8 +443,7 @@ class PrivateSniptResource(ModelResource): bundle = self._clean_publish_date(bundle) return super(PrivateSniptResource, self) \ - .obj_update(bundle, - user=bundle.request.user, **kwargs) + .obj_update(bundle, **kwargs) def _clean_publish_date(self, bundle): if bundle.data['blog_post'] and 'publish_date' not in bundle.data: diff --git a/snipts/migrations/0003_snipt_last_user_saved.py b/snipts/migrations/0003_snipt_last_user_saved.py new file mode 100644 index 0000000..56200e9 --- /dev/null +++ b/snipts/migrations/0003_snipt_last_user_saved.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +from django.conf import settings + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('snipts', '0002_sniptlogentry'), + ] + + operations = [ + migrations.AddField( + model_name='snipt', + name='last_user_saved', + field=models.ForeignKey(related_name='last_user_saved', blank=True, to=settings.AUTH_USER_MODEL, null=True), + ), + ] diff --git a/snipts/models.py b/snipts/models.py index f7ef962..a96f342 100644 --- a/snipts/models.py +++ b/snipts/models.py @@ -16,12 +16,17 @@ from pygments.util import ClassNotFound from snipts.utils import slugify_uniquely from taggit.managers import TaggableManager from taggit.utils import edit_string_for_tags +from teams.models import Team class Snipt(models.Model): """An individual Snipt.""" user = models.ForeignKey(User, blank=True, null=True) + last_user_saved = models.ForeignKey(User, + blank=True, + null=True, + related_name='last_user_saved') title = models.CharField(max_length=255, blank=True, null=True, default='Untitled') @@ -174,7 +179,7 @@ class Snipt(models.Model): diff = self._unidiff_output(self.original_code or '', self.code) if (diff != ''): - log_entry = SniptLogEntry(user=self.user, + log_entry = SniptLogEntry(user=self.last_user_saved, snipt=self, code=self.code, diff=diff) @@ -298,10 +303,13 @@ class Snipt(models.Model): else: return get_lexer_by_name(self.lexer).name - @property def is_authorized_user(self, user): if self.user == user: return True + if self.user.profile.is_a_team: + team = Team.objects.get(user=self.user) + return team.user_is_member(user) + return False class SniptLogEntry(models.Model): diff --git a/snipts/templates/snipts/snipt-list.html b/snipts/templates/snipts/snipt-list.html index 6228c8e..8db8b02 100644 --- a/snipts/templates/snipts/snipt-list.html +++ b/snipts/templates/snipts/snipt-list.html @@ -15,7 +15,7 @@ {% if snipt.line_count > 8 and not detail and 'snipt-expand' not in snipt.tags_list %} expandable {% endif %} - {% if snipt.user == request.user %} + {% if snipt|is_authorized_user:request.user %} editable {% endif %} {% if is_favorited %} @@ -113,7 +113,7 @@ {% block aside %}