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 \
|
public=True).count() > 0 \
|
||||||
else False
|
else False
|
||||||
|
|
||||||
|
@property
|
||||||
def is_a_team(self):
|
def is_a_team(self):
|
||||||
return True if get_object_or_None(Team, user=self.user) else False
|
return True if get_object_or_None(Team, user=self.user) else False
|
||||||
|
|
||||||
|
|
|
@ -491,7 +491,11 @@
|
||||||
window.site.$main_edit).removeAttr('disabled');
|
window.site.$main_edit).removeAttr('disabled');
|
||||||
},
|
},
|
||||||
error: function(model, response) {
|
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)
|
return object_list.filter(user=bundle.request.user)
|
||||||
|
|
||||||
def read_detail(self, object_list, bundle):
|
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):
|
def create_list(self, object_list, bundle):
|
||||||
raise Unauthorized()
|
raise Unauthorized()
|
||||||
|
@ -68,7 +68,7 @@ class PrivateSniptAuthorization(Authorization):
|
||||||
raise Unauthorized()
|
raise Unauthorized()
|
||||||
|
|
||||||
def update_detail(self, object_list, bundle):
|
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):
|
def delete_list(self, object_list, bundle):
|
||||||
raise Unauthorized()
|
raise Unauthorized()
|
||||||
|
@ -359,6 +359,7 @@ class PrivateUserResource(ModelResource):
|
||||||
|
|
||||||
class PrivateSniptResource(ModelResource):
|
class PrivateSniptResource(ModelResource):
|
||||||
user = fields.ForeignKey(PrivateUserResource, 'user', full=True)
|
user = fields.ForeignKey(PrivateUserResource, 'user', full=True)
|
||||||
|
last_user_saved = fields.ForeignKey(PrivateUserResource, 'last_user_saved', full=False)
|
||||||
tags_list = ListField()
|
tags_list = ListField()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
@ -419,7 +420,16 @@ class PrivateSniptResource(ModelResource):
|
||||||
user=bundle.request.user, **kwargs)
|
user=bundle.request.user, **kwargs)
|
||||||
|
|
||||||
def obj_update(self, bundle, **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['created'] = None
|
||||||
bundle.data['modified'] = None
|
bundle.data['modified'] = None
|
||||||
|
|
||||||
|
@ -433,8 +443,7 @@ class PrivateSniptResource(ModelResource):
|
||||||
bundle = self._clean_publish_date(bundle)
|
bundle = self._clean_publish_date(bundle)
|
||||||
|
|
||||||
return super(PrivateSniptResource, self) \
|
return super(PrivateSniptResource, self) \
|
||||||
.obj_update(bundle,
|
.obj_update(bundle, **kwargs)
|
||||||
user=bundle.request.user, **kwargs)
|
|
||||||
|
|
||||||
def _clean_publish_date(self, bundle):
|
def _clean_publish_date(self, bundle):
|
||||||
if bundle.data['blog_post'] and 'publish_date' not in bundle.data:
|
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 snipts.utils import slugify_uniquely
|
||||||
from taggit.managers import TaggableManager
|
from taggit.managers import TaggableManager
|
||||||
from taggit.utils import edit_string_for_tags
|
from taggit.utils import edit_string_for_tags
|
||||||
|
from teams.models import Team
|
||||||
|
|
||||||
|
|
||||||
class Snipt(models.Model):
|
class Snipt(models.Model):
|
||||||
"""An individual Snipt."""
|
"""An individual Snipt."""
|
||||||
|
|
||||||
user = models.ForeignKey(User, blank=True, null=True)
|
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,
|
title = models.CharField(max_length=255, blank=True, null=True,
|
||||||
default='Untitled')
|
default='Untitled')
|
||||||
|
@ -174,7 +179,7 @@ class Snipt(models.Model):
|
||||||
diff = self._unidiff_output(self.original_code or '', self.code)
|
diff = self._unidiff_output(self.original_code or '', self.code)
|
||||||
|
|
||||||
if (diff != ''):
|
if (diff != ''):
|
||||||
log_entry = SniptLogEntry(user=self.user,
|
log_entry = SniptLogEntry(user=self.last_user_saved,
|
||||||
snipt=self,
|
snipt=self,
|
||||||
code=self.code,
|
code=self.code,
|
||||||
diff=diff)
|
diff=diff)
|
||||||
|
@ -298,10 +303,13 @@ class Snipt(models.Model):
|
||||||
else:
|
else:
|
||||||
return get_lexer_by_name(self.lexer).name
|
return get_lexer_by_name(self.lexer).name
|
||||||
|
|
||||||
@property
|
|
||||||
def is_authorized_user(self, user):
|
def is_authorized_user(self, user):
|
||||||
if self.user == user:
|
if self.user == user:
|
||||||
return True
|
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):
|
class SniptLogEntry(models.Model):
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
{% if snipt.line_count > 8 and not detail and 'snipt-expand' not in snipt.tags_list %}
|
{% if snipt.line_count > 8 and not detail and 'snipt-expand' not in snipt.tags_list %}
|
||||||
expandable
|
expandable
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if snipt.user == request.user %}
|
{% if snipt|is_authorized_user:request.user %}
|
||||||
editable
|
editable
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if is_favorited %}
|
{% if is_favorited %}
|
||||||
|
@ -113,7 +113,7 @@
|
||||||
{% block aside %}
|
{% block aside %}
|
||||||
<aside ng-show="!account || account.list_view == 'N'">
|
<aside ng-show="!account || account.list_view == 'N'">
|
||||||
<ul class="options">
|
<ul class="options">
|
||||||
{% if snipt.user == request.user %}
|
{% if snipt|is_authorized_user:request.user %}
|
||||||
{% if snipt.line_count <= 300 or detail %}
|
{% if snipt.line_count <= 300 or detail %}
|
||||||
<li>
|
<li>
|
||||||
<a class="edit" href="#">Edit</a>
|
<a class="edit" href="#">Edit</a>
|
||||||
|
@ -132,7 +132,7 @@
|
||||||
<a class="copy" href="#">Copy</a>
|
<a class="copy" href="#">Copy</a>
|
||||||
</li>
|
</li>
|
||||||
{% endif %}
|
{% 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>
|
<li>
|
||||||
{% if is_favorited %}
|
{% if is_favorited %}
|
||||||
<a class="favorite favorited" href="#">Favorited</a>
|
<a class="favorite favorited" href="#">Favorited</a>
|
||||||
|
@ -178,7 +178,9 @@
|
||||||
<li class="author">
|
<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>
|
<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>
|
<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>
|
<span class="pro"><a href="/pro/">Pro</a></span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if snipt.user.profile.gittip_username %}
|
{% if snipt.user.profile.gittip_username %}
|
||||||
|
@ -234,7 +236,7 @@
|
||||||
<div class="hide public">{{ snipt.public }}</div>
|
<div class="hide public">{{ snipt.public }}</div>
|
||||||
<div class="hide blog-post">{{ snipt.blog_post }}</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>
|
<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>
|
<div class="hide resource-uri">/api/private/snipt/{{ snipt.pk }}/</div>
|
||||||
{% else %}
|
{% else %}
|
||||||
<div class="hide resource-uri">/api/public/snipt/{{ snipt.pk }}/</div>
|
<div class="hide resource-uri">/api/public/snipt/{{ snipt.pk }}/</div>
|
||||||
|
|
|
@ -61,3 +61,8 @@ def generate_line_numbers(context, line_numbers):
|
||||||
@register.filter
|
@register.filter
|
||||||
def md5(string):
|
def md5(string):
|
||||||
return hashlib.md5(string.lower()).hexdigest()
|
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 \
|
if user == request.user or \
|
||||||
(request.GET.get('api_key') == user.api_key.key) 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
|
public = False
|
||||||
|
|
||||||
|
|
|
@ -60,6 +60,6 @@ class Team(models.Model):
|
||||||
return plan_map[self.plan]
|
return plan_map[self.plan]
|
||||||
|
|
||||||
def user_is_member(self, user):
|
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 True
|
||||||
return False
|
return False
|
||||||
|
|
Loading…
Reference in New Issue