Commit 33262020 by Kálmán Viktor

dashboard: use gravatar avatar option

parent 8e6400ed
......@@ -26,7 +26,7 @@ from django.contrib.auth.signals import user_logged_in
from django.core.urlresolvers import reverse
from django.db.models import (
Model, ForeignKey, OneToOneField, CharField, IntegerField, TextField,
DateTimeField, permalink,
DateTimeField, permalink, BooleanField
)
from django.template.loader import render_to_string
from django.utils.translation import ugettext_lazy as _, override, ugettext
......@@ -83,6 +83,7 @@ class Profile(Model):
unique=True, blank=True, null=True, max_length=64,
help_text=_('Unique identifier of the person, e.g. a student number.'))
instance_limit = IntegerField(default=5)
use_gravatar = BooleanField(default=False)
def notify(self, subject, template, context={}, valid_until=None):
return Notification.send(self.user, subject, template, context,
......
......@@ -672,3 +672,7 @@ textarea[name="list-new-namelist"] {
color: #555 !important;
text-decoration: none;
}
#dashboard-profile-avatar {
max-width: 200px;
}
$(function() {
// change user avatar
$("#dashboard-profile-use-gravatar").click(function() {
var checked = $(this).prop("checked");
var user = $(this).data("user");
$.ajax({
type: 'POST',
url:"/dashboard/profile/" + user + "/use_gravatar/",
headers: {"X-CSRFToken": getCookie('csrftoken')},
success: function(re) {
if(re.new_avatar_url) {
$("#dashboard-profile-avatar").prop("src", re.new_avatar_url);
}
},
error: function(xhr, textStatus, error) {
if(xhr.status == 403) {
addMessage(gettext("You have no permission to change this profile."), "danger");
} else {
addMessage(gettext("Unknown error."), "danger");
}
}
});
});
});
......@@ -19,7 +19,7 @@
<div class="panel-body">
<div>
<div class="" style="float: left">
<img src="{{ avatar_url }}?s=200" class="img-rounded"/>
<img id="dashboard-profile-avatar" src="{{ avatar_url }}" class="img-rounded"/>
</div>
<div class="" style="padding-left: 215px;">
<p>Username: {{ profile.username }}</p>
......@@ -27,10 +27,14 @@
<p>First name: {{ profile.first_name|default:"-" }}</p>
<p>Last name: {{ profile.last_name|default:"-" }}</p>
<p>Email address: {{ profile.email }}</p>
{% if request.user == profile %}
<p>
Use email address as Gravatar profile image:
<input type="checkbox"/> <a href="https://gravatar.com">What's Gravatar?</a>
</p>
<input id="dashboard-profile-use-gravatar" data-user="{{ profile.pk }}"
{% if profile.profile.use_gravatar %}checked="checked"{% endif %}
type="checkbox"/> <a href="https://gravatar.com">What's Gravatar?</a>
</p>
{% endif %}
</div>
<div class="clearfix"></div>
</div>
......@@ -96,3 +100,7 @@
</div>
{% endblock %}
{% block extra_js %}
<script src="{{ STATIC_URL }}dashboard/profile.js"></script>
{% endblock %}
......@@ -34,7 +34,7 @@ from .views import (
GroupCreate,
TemplateChoose,
UserCreationView,
ProfileView,
ProfileView, toggle_use_gravatar,
)
urlpatterns = patterns(
......@@ -133,8 +133,9 @@ urlpatterns = patterns(
url(r'^interface/(?P<pk>\d+)/delete/$', InterfaceDeleteView.as_view(),
name="dashboard.views.interface-delete"),
url(r'^profile/(?P<pk>\d+)$', ProfileView.as_view(),
url(r'^profile/(?P<pk>\d+)/$', ProfileView.as_view(),
name="dashboard.views.profile"),
url(r'^profile/(?P<pk>\d+)/use_gravatar/$', toggle_use_gravatar),
url(r'^group/(?P<group_pk>\d+)/remove/acl/user/(?P<member_pk>\d+)/$',
GroupRemoveAclUserView.as_view(),
......
......@@ -36,7 +36,7 @@ from django.core.urlresolvers import reverse, reverse_lazy
from django.db.models import Count
from django.http import HttpResponse, HttpResponseRedirect, Http404
from django.shortcuts import redirect, render, get_object_or_404
from django.views.decorators.http import require_GET
from django.views.decorators.http import require_GET, require_POST
from django.views.generic.detail import SingleObjectMixin
from django.views.generic import (TemplateView, DetailView, View, DeleteView,
UpdateView, CreateView, ListView)
......@@ -46,6 +46,7 @@ from django.utils.translation import ungettext as __
from django.template.defaultfilters import title as title_filter
from django.template.loader import render_to_string
from django.template import RequestContext
from django.templatetags.static import static
from django.forms.models import inlineformset_factory
from django_tables2 import SingleTableView
......@@ -2652,14 +2653,14 @@ class InterfaceDeleteView(DeleteView):
self.object.instance.get_absolute_url()
class ProfileView(DetailView):
class ProfileView(LoginRequiredMixin, DetailView):
template_name = "dashboard/profile.html"
model = User
def get_context_data(self, **kwargs):
context = super(ProfileView, self).get_context_data(**kwargs)
context['profile'] = self.get_object()
context['avatar_url'] = self.get_avatar_url()
context['avatar_url'] = get_user_avatar_url(context['profile'])
context['instances_owned'] = Instance.get_objects_with_level(
"owner", self.get_object(), disregard_superuser=True
).filter(destroyed_at=None)
......@@ -2694,7 +2695,27 @@ class ProfileView(DetailView):
'instances_with_access'].filter(template__in=it)
return context
def get_avatar_url(self):
user = self.get_object()
@require_POST
def toggle_use_gravatar(request, **kwargs):
user = get_object_or_404(User, pk=kwargs['pk'])
if not request.user == user:
raise PermissionDenied()
profile = user.profile
profile.use_gravatar = not profile.use_gravatar
profile.save()
new_avatar_url = get_user_avatar_url(user)
return HttpResponse(
json.dumps({'new_avatar_url': new_avatar_url}),
content_type="application/json",
)
def get_user_avatar_url(user):
if user.profile.use_gravatar:
gravatar_hash = md5(user.email).hexdigest()
return "https://gravatar.com/avatar/%s" % gravatar_hash
return "https://secure.gravatar.com/avatar/%s?s=200" % gravatar_hash
else:
return static("dashboard/img/avatar.png")
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment