Let team members save team-snipts, and record last user.

master
Nick Sergeant 2015-10-18 11:52:44 -04:00
parent 9c96783c84
commit ecbcad607b
9 changed files with 66 additions and 15 deletions

View File

@ -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

View File

@ -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));
}
}
});
},

View File

@ -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:

View File

@ -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),
),
]

View File

@ -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):

View File

@ -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 %}
<aside ng-show="!account || account.list_view == 'N'">
<ul class="options">
{% if snipt.user == request.user %}
{% if snipt|is_authorized_user:request.user %}
{% if snipt.line_count <= 300 or detail %}
<li>
<a class="edit" href="#">Edit</a>
@ -132,7 +132,7 @@
<a class="copy" href="#">Copy</a>
</li>
{% endif %}
{% if snipt.user != request.user and request.user.is_authenticated %}
{% if snipt.user != request.user and request.user.is_authenticated and not snipt.user.team %}
<li>
{% if is_favorited %}
<a class="favorite favorited" href="#">Favorited</a>
@ -178,7 +178,9 @@
<li class="author">
<span class="avatar" style="background-image: url('https://secure.gravatar.com/avatar/{{ snipt.user.email|md5 }}?s=15&amp;d=https://snipt.s3.amazonaws.com/img/author-icon.png');"></span>
<a href="{{ snipt.user.get_absolute_url }}">{{ snipt.user.username }}</a>
{% if snipt.user.profile.is_pro %}
{% if snipt.user.profile.is_a_team %}
<span class="pro"><a href="/for-teams/">Team</a></span>
{% elif snipt.user.profile.is_pro %}
<span class="pro"><a href="/pro/">Pro</a></span>
{% endif %}
{% if snipt.user.profile.gittip_username %}
@ -234,7 +236,7 @@
<div class="hide public">{{ snipt.public }}</div>
<div class="hide blog-post">{{ snipt.blog_post }}</div>
<div class="hide publish-date">{{ snipt.publish_date|date:"M d, Y \a\t h:i A" }}</div>
{% if snipt.user == request.user %}
{% if snipt|is_authorized_user:request.user %}
<div class="hide resource-uri">/api/private/snipt/{{ snipt.pk }}/</div>
{% else %}
<div class="hide resource-uri">/api/public/snipt/{{ snipt.pk }}/</div>

View File

@ -61,3 +61,8 @@ def generate_line_numbers(context, line_numbers):
@register.filter
def md5(string):
return hashlib.md5(string.lower()).hexdigest()
@register.filter
def is_authorized_user(snipt, user):
return snipt.is_authorized_user(user)

View File

@ -197,7 +197,8 @@ def list_user(request, username_or_custom_slug, tag_slug=None):
if user == request.user or \
(request.GET.get('api_key') == user.api_key.key) or \
(user.team and user.team.user_is_member(request.user)):
(user.profile.is_a_team and
user.team.user_is_member(request.user)):
public = False

View File

@ -60,6 +60,6 @@ class Team(models.Model):
return plan_map[self.plan]
def user_is_member(self, user):
if self.owner == user or user in self.members:
if self.owner == user or user in self.members.all():
return True
return False