mirror of
https://github.com/nottinghamtec/PyRIGS.git
synced 2026-01-26 01:42:16 +00:00
Added profile Modals & links from activity feed
This commit is contained in:
66
RIGS/migrations/0023_auto_20150529_0048.py
Normal file
66
RIGS/migrations/0023_auto_20150529_0048.py
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import models, migrations
|
||||||
|
import django.core.validators
|
||||||
|
import django.contrib.auth.models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('RIGS', '0022_auto_20150424_2104'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterModelOptions(
|
||||||
|
name='profile',
|
||||||
|
options={'permissions': (('view_profile', 'Can view Profile'),)},
|
||||||
|
),
|
||||||
|
migrations.AlterModelManagers(
|
||||||
|
name='profile',
|
||||||
|
managers=[
|
||||||
|
('objects', django.contrib.auth.models.UserManager()),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='event',
|
||||||
|
name='collector',
|
||||||
|
field=models.CharField(max_length=255, null=True, verbose_name=b'collected by', blank=True),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='organisation',
|
||||||
|
name='email',
|
||||||
|
field=models.EmailField(max_length=254, null=True, blank=True),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='person',
|
||||||
|
name='email',
|
||||||
|
field=models.EmailField(max_length=254, null=True, blank=True),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='profile',
|
||||||
|
name='email',
|
||||||
|
field=models.EmailField(max_length=254, verbose_name='email address', blank=True),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='profile',
|
||||||
|
name='groups',
|
||||||
|
field=models.ManyToManyField(related_query_name='user', related_name='user_set', to='auth.Group', blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', verbose_name='groups'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='profile',
|
||||||
|
name='last_login',
|
||||||
|
field=models.DateTimeField(null=True, verbose_name='last login', blank=True),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='profile',
|
||||||
|
name='username',
|
||||||
|
field=models.CharField(error_messages={'unique': 'A user with that username already exists.'}, max_length=30, validators=[django.core.validators.RegexValidator('^[\\w.@+-]+$', 'Enter a valid username. This value may contain only letters, numbers and @/./+/-/_ characters.', 'invalid')], help_text='Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only.', unique=True, verbose_name='username'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='venue',
|
||||||
|
name='email',
|
||||||
|
field=models.EmailField(max_length=254, null=True, blank=True),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -38,9 +38,18 @@ class Profile(AbstractUser):
|
|||||||
def name(self):
|
def name(self):
|
||||||
return self.get_full_name() + ' "' + self.initials + '"'
|
return self.get_full_name() + ' "' + self.initials + '"'
|
||||||
|
|
||||||
|
@property
|
||||||
|
def latest_events(self):
|
||||||
|
return self.event_mic.order_by('-start_date').select_related('person', 'organisation', 'venue', 'mic')
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.name
|
return self.name
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
permissions = (
|
||||||
|
('view_profile', 'Can view Profile'),
|
||||||
|
)
|
||||||
|
|
||||||
class RevisionMixin(object):
|
class RevisionMixin(object):
|
||||||
@property
|
@property
|
||||||
def last_edited_at(self):
|
def last_edited_at(self):
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
{% load to_class_name from filters %}
|
{% load to_class_name from filters %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
{% if request.is_ajax %}
|
|
||||||
<div class="list-group-item">
|
<div class="list-group-item">
|
||||||
<div class="media">
|
<div class="media">
|
||||||
{% for version in object_list %}
|
{% for version in object_list %}
|
||||||
@@ -19,9 +19,11 @@
|
|||||||
<div class="media">
|
<div class="media">
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<div class="media-left">
|
<div class="media-left">
|
||||||
<a href="#">
|
{% if version.revision.user %}
|
||||||
<img class="media-object img-rounded" src="{{ version.revision.user.profile_picture}}" />
|
<a href="{% url 'profile_detail' pk=version.revision.user.pk %}" class="modal-href">
|
||||||
</a>
|
<img class="media-object img-rounded" src="{{ version.revision.user.profile_picture}}" />
|
||||||
|
</a>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
<div class="media-body">
|
<div class="media-body">
|
||||||
<h5>{{ version.revision.user.name }}
|
<h5>{{ version.revision.user.name }}
|
||||||
@@ -45,5 +47,5 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@@ -1,91 +1,104 @@
|
|||||||
{% extends 'base.html' %}
|
{% extends request.is_ajax|yesno:"base_ajax.html,base.html" %}
|
||||||
|
|
||||||
{% block title %}RIGS Profile {{object.pk}}{% endblock %}
|
{% block title %}RIGS Profile {{object.pk}}{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="col-md-10 col-md-offset-1">
|
<div class="row">
|
||||||
|
<div class="col-md-10 col-md-offset-1">
|
||||||
<div class="col-sm-12">
|
|
||||||
|
<div class="col-sm-6">
|
||||||
<div class="col-sm-6">
|
<h3>{{object.name}}</h3>
|
||||||
<h3>{{object.name}}</h3>
|
</div>
|
||||||
|
{% if not request.is_ajax %}
|
||||||
|
{% if object.pk == user.pk %}
|
||||||
|
<div class="col-sm-6 text-right">
|
||||||
|
<div class="btn-group btn-page">
|
||||||
|
<a href="{% url 'profile_update_self' %}" class="btn btn-default">
|
||||||
|
Edit Profile <span class="glyphicon glyphicon-pencil"></span>
|
||||||
|
</a>
|
||||||
|
<a href="{% url 'password_change' %}" class="btn btn-default">
|
||||||
|
Change Password <span class="glyphicon glyphicon-lock"></span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
<div class="col-sm-8 ">
|
||||||
|
<dl class="dl-horizontal">
|
||||||
|
<dt>First Name</dt>
|
||||||
|
<dd>{{object.first_name}}</dd>
|
||||||
|
|
||||||
|
<dt>Last Name</dt>
|
||||||
|
<dd>{{object.last_name}}</dd>
|
||||||
|
|
||||||
|
<dt>Email</dt>
|
||||||
|
<dd>{{object.email}}</dd>
|
||||||
|
|
||||||
|
<dt>Last Login</dt>
|
||||||
|
<dd>{{object.last_login|date:"d/m/Y H:i"}}</dd>
|
||||||
|
|
||||||
|
<dt>Date Joined</dt>
|
||||||
|
<dd>{{object.date_joined|date:"d/m/Y H:i"}}</dd>
|
||||||
|
|
||||||
|
<dt>Initials</dt>
|
||||||
|
<dd>{{object.initials}}</dd>
|
||||||
|
|
||||||
|
<dt>Phone</dt>
|
||||||
|
<dd>{{object.phone}}</dd>
|
||||||
|
</dl>
|
||||||
|
{% if not request.is_ajax %}
|
||||||
|
{% if object.pk == user.pk %}
|
||||||
|
|
||||||
|
<div class="pull-right">
|
||||||
|
<a href="{% url 'reset_api_key' %}" class="btn btn-default">
|
||||||
|
{% if user.api_key %}Reset API Key{% else %}Generate API Key{% endif %}
|
||||||
|
<span class="glyphicon glyphicon-repeat"></span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h4>Personal iCal Details</h4>
|
||||||
|
|
||||||
|
<dl class="dl-horizontal">
|
||||||
|
<dt>API Key</dt>
|
||||||
|
<dd>
|
||||||
|
{% if user.api_key %}
|
||||||
|
{{user.api_key}}
|
||||||
|
{% else %}
|
||||||
|
No API Key Generated
|
||||||
|
{% endif %}
|
||||||
|
</dd>
|
||||||
|
|
||||||
|
<dt>Calendar URL</dt>
|
||||||
|
<dd>
|
||||||
|
{% if user.api_key %}
|
||||||
|
<pre>http{{ request.is_secure|yesno:"s,"}}://{{ request.get_host }}{% url 'ics_calendar' api_pk=user.pk api_key=user.api_key %}</pre>
|
||||||
|
<small><a href="http://www.google.com/calendar/render?cid=http{{ request.is_secure|yesno:"s,"}}://{{ request.get_host }}{% url 'ics_calendar' api_pk=user.pk api_key=user.api_key %}">Click here</a> to add to google calendar.<br/>
|
||||||
|
To sync from google calendar to mobile device, visit <a href="https://www.google.com/calendar/syncselect" target="_blank">this page</a> on your device and tick "RIGS Calendar".</small>
|
||||||
|
{% else %}
|
||||||
|
<pre>No API Key Generated</pre>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
</dd>
|
||||||
|
</dl>
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-sm-3">
|
||||||
|
<div class="center-block">
|
||||||
|
<img src="{{object.profile_picture}}" class="img-responsive img-rounded" />
|
||||||
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
{% if object.pk == user.pk %}
|
|
||||||
<div class="col-sm-6 text-right">
|
<div class="row">
|
||||||
<div class="btn-group btn-page">
|
<div class="col-sm-12">
|
||||||
<a href="{% url 'profile_update_self' %}" class="btn btn-default">
|
<h4>Events</h4>
|
||||||
Edit Profile <span class="glyphicon glyphicon-pencil"></span>
|
{% with object.latest_events as events %}
|
||||||
</a>
|
{% include 'RIGS/event_table.html' %}
|
||||||
<a href="{% url 'password_change' %}" class="btn btn-default">
|
{% endwith %}
|
||||||
Change Password <span class="glyphicon glyphicon-lock"></span>
|
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
|
||||||
<div class="col-sm-8 ">
|
|
||||||
<dl class="dl-horizontal">
|
|
||||||
<dt>First Name</dt>
|
|
||||||
<dd>{{object.first_name}}</dd>
|
|
||||||
|
|
||||||
<dt>Last Name</dt>
|
|
||||||
<dd>{{object.last_name}}</dd>
|
|
||||||
|
|
||||||
<dt>Email</dt>
|
|
||||||
<dd>{{object.email}}</dd>
|
|
||||||
|
|
||||||
<dt>Last Login</dt>
|
|
||||||
<dd>{{object.last_login|date:"d/m/Y H:i"}}</dd>
|
|
||||||
|
|
||||||
<dt>Date Joined</dt>
|
|
||||||
<dd>{{object.date_joined|date:"d/m/Y H:i"}}</dd>
|
|
||||||
|
|
||||||
<dt>Initials</dt>
|
|
||||||
<dd>{{object.initials}}</dd>
|
|
||||||
|
|
||||||
<dt>Phone</dt>
|
|
||||||
<dd>{{object.phone}}</dd>
|
|
||||||
</dl>
|
|
||||||
{% if object.pk == user.pk %}
|
|
||||||
|
|
||||||
<div class="pull-right">
|
|
||||||
<a href="{% url 'reset_api_key' %}" class="btn btn-default">
|
|
||||||
{% if user.api_key %}Reset API Key{% else %}Generate API Key{% endif %}
|
|
||||||
<span class="glyphicon glyphicon-repeat"></span>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<h4>Personal iCal Details</h4>
|
|
||||||
|
|
||||||
<dl class="dl-horizontal">
|
|
||||||
<dt>API Key</dt>
|
|
||||||
<dd>
|
|
||||||
{% if user.api_key %}
|
|
||||||
{{user.api_key}}
|
|
||||||
{% else %}
|
|
||||||
No API Key Generated
|
|
||||||
{% endif %}
|
|
||||||
</dd>
|
|
||||||
|
|
||||||
<dt>Calendar URL</dt>
|
|
||||||
<dd>
|
|
||||||
{% if user.api_key %}
|
|
||||||
<pre>http{{ request.is_secure|yesno:"s,"}}://{{ request.get_host }}{% url 'ics_calendar' api_pk=user.pk api_key=user.api_key %}</pre>
|
|
||||||
<small><a href="http://www.google.com/calendar/render?cid=http{{ request.is_secure|yesno:"s,"}}://{{ request.get_host }}{% url 'ics_calendar' api_pk=user.pk api_key=user.api_key %}">Click here</a> to add to google calendar.<br/>
|
|
||||||
To sync from google calendar to mobile device, visit <a href="https://www.google.com/calendar/syncselect" target="_blank">this page</a> on your device and tick "RIGS Calendar".</small>
|
|
||||||
{% else %}
|
|
||||||
<pre>No API Key Generated</pre>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="col-sm-3">
|
|
||||||
<div class="center-block">
|
|
||||||
<img src="{{object.profile_picture}}" class="img-responsive img-rounded" />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
Reference in New Issue
Block a user