diff --git a/src/memberdb/models.py b/src/memberdb/models.py index eb6b28096dab64875bb54a38daeeecc0eba57acd..d029bf198fe8817aa349e51b80707c13ac1fda1b 100644 --- a/src/memberdb/models.py +++ b/src/memberdb/models.py @@ -186,6 +186,7 @@ class Member (IncAssocMember): guild_confirm = models.BooleanField ('Guild status confirmed', null=False, editable=False, default=False) has_account = models.BooleanField ('Has AD account', null=False, editable=False, default=False) + dark_theme_enabled = models.BooleanField ('Is dark theme enabled', null=False, editable=False, default=True) def get_last_renewal(self): """ returns the most recently submitted Membership object """ diff --git a/src/memberdb/register.py b/src/memberdb/register.py index 99ba5d15d136a699eaa5b079593c0d0bf5b3cf06..faf5bcbace53591742fc572152420a55ca3d6001 100644 --- a/src/memberdb/register.py +++ b/src/memberdb/register.py @@ -153,7 +153,7 @@ def thanks_view(request, member, ms): return render(request, 'thanks.html', context) class RenewView(LoginRequiredMixin, RegisterView): - template_name = 'renew.html' + template_name = 'membership_renewal.html' form_class = RenewForm model = Member @@ -177,6 +177,8 @@ class RenewView(LoginRequiredMixin, RegisterView): # renew.html says whether a record exists in the DB or not context['is_new'] = self.request.member is None + context['membership'] = 'active' + context['membership_renewal'] = 'active' # let the template check if user has already renewed this year so it displays a warning if last_renewal is not None: diff --git a/src/memberdb/urls.py b/src/memberdb/urls.py index 4dce9419bb1a1fd0a5142b6eac0a3a65d3f3f52d..3bf5f59908ee501a210728cf76ddc1436e914e0b 100644 --- a/src/memberdb/urls.py +++ b/src/memberdb/urls.py @@ -2,12 +2,12 @@ from django.urls import path from django.contrib.auth import views as auth_views from django.views.generic.base import TemplateView -from .views import MemberHomeView, MemberTokenView, EmailConfirmView +from .views import MembershipSummary, MemberHomeView, MemberTokenView, EmailConfirmView from .register import RegisterView, RenewView app_name = 'memberdb' urlpatterns = [ - path('', MemberHomeView.as_view(), name='home'), + path('', MembershipSummary.as_view(), name='home'), path('', MemberHomeView.as_view(), name='index'), # use the django-provided login views with our custom templates diff --git a/src/memberdb/views.py b/src/memberdb/views.py index 19e40304f5648e01fa55512b1409ca8d0db3ebcb..9392728fdcd912d1555c74dad69bd905daf90971 100644 --- a/src/memberdb/views.py +++ b/src/memberdb/views.py @@ -108,7 +108,7 @@ class MyWizardView(SessionWizardView): class MemberHomeView(MemberAccessMixin, MyUpdateView): model = Member - template_name = 'home.html' + template_name = 'membership_summary.html' form_class = MemberHomeForm def get_object(self): @@ -133,6 +133,31 @@ class MemberHomeView(MemberAccessMixin, MyUpdateView): # redisplay the page return self.get(self.request) + +class MembershipSummary(MemberAccessMixin, MyUpdateView): + model = Member + template_name = 'membership_summary.html' + form_class = MemberHomeForm + + def get_object(self): + return self.request.member + + def get_context_data(self): + context = super().get_context_data() + member = self.get_object() + + if member is not None: + # get a list of all the membership records associated with this member + ms_list = member.memberships.all() + context.update({ + 'memberships': ms_list, + 'membership_summary': 'active', + 'membership': 'active', + }) + return context + + + class MemberTokenView(View): """ allow a user to login using a unique (secure) member token """ def get(self, request, **kwargs): diff --git a/src/templates/admin/base_site.html b/src/templates/admin/base_site.html index 6440df7380fbd19c5ef1aaf7d03b418c76f20bee..7358afd1d67279dad85de492f1c09103802648b3 100644 --- a/src/templates/admin/base_site.html +++ b/src/templates/admin/base_site.html @@ -5,10 +5,10 @@ {% get_current_language as LANGUAGE_CODE %}{% get_current_language_bidi as LANGUAGE_BIDI %} {% block prestyle %} - <link rel="stylesheet" type="text/css" href="{% block stylesheet %}{% static "admin/css/base.css" %}{% endblock %}"> + {#<link rel="stylesheet" type="text/css" href="{% block stylesheet %}{% static "admin/css/base.css" %}{% endblock %}">#} {% block responsive %} <meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1.0, maximum-scale=1.0"> - <link rel="stylesheet" type="text/css" href="{% static "admin/css/responsive.css" %}"> + {#<link rel="stylesheet" type="text/css" href="{% static "admin/css/responsive.css" %}">#} {% endblock %} {% endblock %} {% block extrastyle %} diff --git a/src/templates/base.html b/src/templates/base.html index 2797bd29020093fd3debcd056ec797ba29ab91d3..32a731cae05f63039d2c4de0a941b0ac011ee303 100644 --- a/src/templates/base.html +++ b/src/templates/base.html @@ -1,4 +1,5 @@ {% load static %} +{% load sass_tags %} <!DOCTYPE html> <html> @@ -32,37 +33,34 @@ </head> <body {% block bodyattrs %}{% endblock %}> +<!-- Container --> + {% block navbar %} + <nav class="navbar navbar-expand-lg grey-900 navbar-dark fixed-top flex-md-nowrap p-0 shadow"> + <a class="navbar-brand col-sm-3 col-md-1 mr-0" title="UCCPortal homepage"> + <div class="font-weight-bold text-light float-left font-italic" text-light>UCCPORTAL</div> + <span class="nav-item float-left logo"></span> + </a> -<!-- Container --> -<div id="container"> - {% block header_div %}<!-- Header --> - <div id="header"> - {% block navbar %} - <nav class="navbar navbar-expand-lg navbar-dark bg-grey-900 font-weight-bold"> - - {% block branding %} - <a class="navbar-brand logo" title="UCCPortal homepage"></a> - {% endblock %} - - <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"> - <span class="navbar-toggler-icon"></span> - </button> - - <div class="collapse navbar-collapse" id="navbarSupportedContent"> - {% with url_name=request.resolver_match.url_name %} - <div class="navbar-nav mr-auto"> + <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"> + <span class="navbar-toggler-icon"></span> + </button> + + <div class="collapse navbar-collapse " id="navbarSupportedContent"> + {% with url_name=request.resolver_match.url_name %} + <div class="navbar-nav mr-auto"> {% if not request.user.is_authenticated or request.user.is_staff %} {% endif %} - {% if request.member %} - <a class="nav-item nav-link {% if url_name == 'home' %}active{% endif %}" href="{% url "memberdb:home" %}">Member home</a> - <a class="nav-item nav-link {% if url_name == 'renew' %}active{% endif %}" href="{% url "memberdb:renew" %}">Renew membership</a> + <a class="nav-item nav-link {{membership}}" href="{% url "memberdb:home" %}">Membership </a> + <a class="nav-item nav-link disabled" >Account</a> {% endif %} {% if request.user.is_staff %} - <a class="nav-item nav-link {% block adminactive %}{% endblock %}" href="{% url "admin:index" %}">Admin site</a> + <a class="nav-item nav-link {% block adminactive %}{% endblock %}" href="{% url "admin:index" %}"> + Admin + </a> <a class="nav-item nav-link {% if url_name == 'register' %}active{% endif %}" href="{% url "memberdb:register" %}">Add Member</a> {% endif %} @@ -70,12 +68,9 @@ <div class="navbar-nav"> {% if request.user.is_authenticated and request.member %} - <div class="nav-item"> - <i class=" align-baseline icon md-light">person</i> - </div> - <div class="nav-item userinfo groups dropdown"> <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> + <i class="icon md-18 md-light" data-feather="user"></i> Welcome, {{ request.user.username }} <!--<div class="navbar-nav userinfo{ if request.user.is_authenticated %}{ if request.member %} groups{ endif %}"> { if request.member %} @@ -83,61 +78,70 @@ { endif %} </div>--> </a> - <div class="dropdown-menu bg-grey-900" aria-labelledby="navbarDropdownMenuLink"> - <a class="nav-item nav-link {% if url_name == 'logout' %}active{% endif %}" href="{% url "memberdb:logout" %}">Logout</a> + <div class="dropdown-menu dropdown-menu-right text-dark" aria-labelledby="navbarDropdownMenuLink"> + <a class="dropdown-item disabled" > Dark theme: off</a> + <div class="dropdown-divider m-0"></div> + <a class="dropdown-item" href="{% url "memberdb:logout" %}">Logout</a> </div> </div> {%else%} - <a class="nav-item nav-link {% if url_name == 'login' %}active{% endif %}" href="{% url "memberdb:login" %}">Login</a> + <a class="btn btn-dark btn-sm my-1 border-light" href='{% url "memberdb:register" %}'>Signup</a> + <a class="nav-item nav-link" href="{% url "memberdb:login" %}">Login</a> {%endif%} </div> {% endwith %} </div> </nav> - {% endblock %} + {% endblock %} - {% block header %}{% endblock %} - - </div> - {% endblock %}<!-- END Header --> + <!-- Alerts --> {% block breadcrumbs %}{% endblock %} {% block messages %}{% if messages %} <ul class="messagelist">{% for message in messages %} <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message|capfirst }}</li> {% endfor %}</ul> {% endif %}{% endblock messages %} - - <!-- Content --> - <div class="text-light bg-dark" id="content"> - {% block pretitle %}{% endblock %} - {% block content_title %}<h1></h1>{% endblock %} - {% block content %} - {% endblock %} - <!-- sidebar --> - {% block sidebar %}{% endblock %} - <br class="clear"> - </div> - <!-- END Content --> - - <!-- Footer --> - {% block footer %} - <div id="footer"> - <p> - The University Computer Club Inc. - ABN: 98 843 368 069 - </p> - <div class="linkslist"> - <a href="https://www.ucc.asn.au">main website</a>• - <a href="https://wiki.ucc.asn.au">UCC wiki</a>• - <a href="https://www.ucc.asn.au/aboutucc/contact.ucc">contact us</a>• - <a href="https://gitlab.ucc.asn.au/frekk/uccportal">source code</a> + <!-- Alerts --> + + <div class="container-fluid "> + {% include "watermark.html" %} + <div class="row"> + <!-- sidebar --> + <nav class="col-md-1 d-none d-md-block bg-light navbar-light sidebar"> + <div class="sidebar-sticky"> + {% block sidebar %}{% endblock %} + </div> + </nav> + <!-- Content --> + <div class="col-md-11 ml-sm-auto col-lg-11 px4"> + <main class="px4 bg-white" role="main"> + {% block content %}{% endblock %} + </main> + + <hr/> + + <div class=" text-center" id="footer"> + <p> + The University Computer Club Inc. + ABN: 98 843 368 069 + </p> + <div class="linkslist"> + <a href="https://www.ucc.asn.au">main website</a>• + <a href="https://wiki.ucc.asn.au">UCC wiki</a>• + <a href="https://www.ucc.asn.au/aboutucc/contact.ucc">contact us</a>• + <a href="https://gitlab.ucc.asn.au/frekk/uccportal">source code</a> + </div> + </div> + </div> </div> - </div> </div> <!-- END Container --> +<script> + feather.replace() +</script> </body> </html> diff --git a/src/templates/home.html b/src/templates/home.html index 63e2e520426e1116a19b0bbe08ec0ff36c2a8f58..b434bfe102bf7debcd1827b738459db2cde8c727 100644 --- a/src/templates/home.html +++ b/src/templates/home.html @@ -25,7 +25,19 @@ {% endif %} {% endblock %} +{%if request.user.is_authenticated%} +{%block sidebar %} + <ul class="nav flex-column"> + <li class="nav-item"><a class="nav-link text-light"> Summary</a></li> + <li class="nav-item"><a class="nav-link text-light"> Renew</a></li> + <li class="nav-item"><a class="nav-link text-light"> Payments</a></li> + </ul> +{% endblock %} +{% endif %} + + {% block extra_preform %} + <div class="form-row"> {% include 'membership_summary.html' %} </div> diff --git a/src/templates/membership_details.html b/src/templates/membership_details.html new file mode 100644 index 0000000000000000000000000000000000000000..fe15e930f9fbb4729a7d3350f51858f3afe4686e --- /dev/null +++ b/src/templates/membership_details.html @@ -0,0 +1,60 @@ +{# this template is used by the admin membership renewal page and member homepage #} +{% load static %} + +{% block header1 %} +<h4>Current member details</h4> +{% endblock %} +{% block member_details %} +<!-- try to display only the details which aren't editable on member home page --> +<table class="member-details"> + {% block name %} + <tr class="{% cycle 'row1' 'row2' as rcl %}"> + <th>Real name</th> + <td><b>{{ member.first_name }} {{ member.last_name }}</b></td> + </tr> + <tr class="{% cycle rcl %}"> + <th>Username & display name</th> + <td><b>{{ member.username }}</b> ({{ member.display_name }})</td> + </tr> + {% endblock %} + + {% block email %} + <tr class="{% cycle rcl %}"> + <th>Contact email</th> + <td> + {% if member.email_address %} + <a href="mailto:{{ member.email_address }}">{{ member.email_address }}</a> + {% else %} + <i>not provided</i> + {% endif %} + </td> + </tr> + {% endblock %} + + {% block phone %} + <tr class="{% cycle rcl %}"> + <th>Phone number</th> + <td>{% if member.phone_number %}{{ member.phone_number }}{% else %}<i>not provided</i>{% endif %}</td> + </tr> + {% endblock %} + + {% block student %} + <tr class="{% cycle rcl %}"> + <th>Is student</th> + <td>{% if member.is_student %}<img src="{% static 'admin/img/icon-yes.svg' %}" alt="yes">{% else %}<img src="{% static 'admin/img/icon-no.svg' %}" alt="no">{% endif %}</td> + </tr> + <tr class="{% cycle rcl %}"> + <th>Is UWA Guild</th> + <td>{% if member.is_guild %}<img src="{% static 'admin/img/icon-yes.svg' %}" alt="yes">{% else %}<img src="{% static 'admin/img/icon-no.svg' %}" alt="no">{% endif %}</td> + </tr> + <tr class="{% cycle rcl %}"> + <th>Student number or Other ID</th> + <td>{% if member.id_number %}{{ member.id_number }}{% else %}<i>not provided</i>{% endif %}</td> + </tr> + <tr class="{% cycle rcl %}"> + <th>ID type</th> + <td>{% if member.id_desc %}{{ member.id_desc }}{% else %}<i>not provided</i>{% endif %}</td> + </tr> + {% endblock %} +</table> +{% endblock %} diff --git a/src/templates/renew.html b/src/templates/membership_renewal.html similarity index 64% rename from src/templates/renew.html rename to src/templates/membership_renewal.html index 3a67a1f072b80ac4d418589fcab5e5323332807a..69e752e321e711a32bbc955d833cbdb4122d2785 100644 --- a/src/templates/renew.html +++ b/src/templates/membership_renewal.html @@ -1,9 +1,16 @@ {% extends "base_form.html" %} +{%load static %} + {% block title %}UCC Membership Renewal{% endblock %} -{% block content_title %} - <h1>Renew your membership for {{ year }}</h1> + +{%block sidebar %} + {% include 'membership_sidebar.html' %} {% endblock %} + +<h1 class="mt-5">Renew your membership for {{ year }}</h1> +<div class="card m-3 mt-5"></div> + {% block tips %} {% if is_new %} <b>Your account exists already but no membership information has yet been recorded in this system.</b> @@ -18,15 +25,18 @@ {% endblock %} {% block extra_preform %} -{% if memberships and last_renewal == year %} -<div class="form-row"> - {% include 'membership_list.html' %} -</div> -{% endif %} -<div class="form-row readonly"> - <label for="id_username">Username:</label> - <span class="text" id="id_username">{{ request.user.username }}</span> -</div> + {% if memberships and last_renewal == year %} + <div class="card md-3"> + <div class="form-row"> + {% include 'membership_list.html' %} + </div> + </div> + {% endif %} + + <div class="form-row readonly"> + <label for="id_username">Username:</label> + <span class="text" id="id_username">{{ request.user.username }}</span> + </div> {% endblock %} {% block action_url %}{% url 'memberdb:renew' %}{% endblock %} diff --git a/src/templates/membership_sidebar.html b/src/templates/membership_sidebar.html new file mode 100644 index 0000000000000000000000000000000000000000..cfb6d9a24f6de1febc872cf83ed744599b5dead4 --- /dev/null +++ b/src/templates/membership_sidebar.html @@ -0,0 +1,12 @@ + + <ul class="nav flex-column "> + <li class="nav-item"> + <a class="nav-link {{membership_summary}}" href="{% url 'memberdb:home' %}"><i class="icon md-18 md-dark" data-feather="info"></i> Summary</a> + </li> + <li class="nav-item"> + <a class="nav-link {{membership_renewal}}" href="{% url 'memberdb:renew' %}"><i class="icon md-18 md-dark" data-feather="refresh-cw"></i> Renewal</a> + </li> + <li class="nav-item"> + <a class="nav-link disabled" href="#"><i class="icon md-18 md-dark" data-feather="dollar-sign"></i> Payments</a> + </li> + </ul> \ No newline at end of file diff --git a/src/templates/membership_summary.html b/src/templates/membership_summary.html index 29d69251a8f0afc62df4c2cdd54132c969a19dd2..bf09f9bc41908b41cf3856153ac58aceda745e7a 100644 --- a/src/templates/membership_summary.html +++ b/src/templates/membership_summary.html @@ -1,59 +1,45 @@ -{# this template is used by the admin membership renewal page and member homepage #} +{% extends "base.html" %} {% load static %} -{% block header1 %} -<h4>Current member details</h4> + +{%block sidebar %} + {% include 'membership_sidebar.html' %} {% endblock %} -{% block member_details %} -<!-- try to display only the details which aren't editable on member home page --> -<table class="member-details"> - {% block name %} - <tr class="{% cycle 'row1' 'row2' as rcl %}"> - <th>Real name</th> - <td><b>{{ member.first_name }} {{ member.last_name }}</b></td> - </tr> - <tr class="{% cycle rcl %}"> - <th>Username & display name</th> - <td><b>{{ member.username }}</b> ({{ member.display_name }})</td> - </tr> - {% endblock %} - - {% block email %} - <tr class="{% cycle rcl %}"> - <th>Contact email</th> - <td> - {% if member.email_address %} - <a href="mailto:{{ member.email_address }}">{{ member.email_address }}</a> - {% else %} - <i>not provided</i> - {% endif %} - </td> - </tr> - {% endblock %} - - {% block phone %} - <tr class="{% cycle rcl %}"> - <th>Phone number</th> - <td>{% if member.phone_number %}{{ member.phone_number }}{% else %}<i>not provided</i>{% endif %}</td> - </tr> - {% endblock %} - - {% block student %} - <tr class="{% cycle rcl %}"> - <th>Is student</th> - <td>{% if member.is_student %}<img src="{% static 'admin/img/icon-yes.svg' %}" alt="yes">{% else %}<img src="{% static 'admin/img/icon-no.svg' %}" alt="no">{% endif %}</td> - </tr> - <tr class="{% cycle rcl %}"> - <th>Is UWA Guild</th> - <td>{% if member.is_guild %}<img src="{% static 'admin/img/icon-yes.svg' %}" alt="yes">{% else %}<img src="{% static 'admin/img/icon-no.svg' %}" alt="no">{% endif %}</td> - </tr> - <tr class="{% cycle rcl %}"> - <th>Student number or Other ID</th> - <td>{% if member.id_number %}{{ member.id_number }}{% else %}<i>not provided</i>{% endif %}</td> - </tr> - <tr class="{% cycle rcl %}"> - <th>ID type</th> - <td>{% if member.id_desc %}{{ member.id_desc }}{% else %}<i>not provided</i>{% endif %}</td> - </tr> - {% endblock %} -</table> + + +{% block tips %} +{% if not request.member %} + {% if request.user.is_authenticated %} + <b>You have no member record associated with this account.</b><br> + Please <a href="{% url 'memberdb:renew' %}">renew your membership</a> to get started. + <br><br> + Note: you may have already paid for this year, but unless the username you entered is the same as the one you are using now, it will not work. + {% else %} + <b>Something went wrong and your membership details could not be retrieved.</b> Please try <a href="{% url 'memberdb:login' %}">logging in</a>. + {% endif %} +{% endif %} {% endblock %} + +{% block content %} +{% block extra_preform %} +<div class="card m-3 mt-5"> + <div class="form-row "> + {% include 'membership_details.html' %} + </div> +</div> + +<div class="card m-3"> + + <div class="form-row"> + <h4>Membership renewals on record</h4> + <!-- stuff from the membership record itself --> + {% if memberships %} + {% include 'membership_list.html' %} + {% else %} + No membership renewal records for your account exist yet. Please <a href="{% url 'memberdb:renew' %}">renew your membership</a> to get started. + {% endif %} + </div> +</div> + +{% endblock extra_preform %} +{% endblock content%} +