Let team members save team-snipts, and record last user.
parent
9c96783c84
commit
ecbcad607b
|
@ -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
|
||||
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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),
|
||||
),
|
||||
]
|
|
@ -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):
|
||||
|
|
|
@ -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&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>
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue