Contextual date improvements
This commit is contained in:
		
							parent
							
								
									2b003b8fa9
								
							
						
					
					
						commit
						a6a508899a
					
				@ -5,16 +5,14 @@ from django.utils import timezone
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class DateRangeMixin:
 | 
					class DateRangeMixin:
 | 
				
			||||||
    def get_start_date(self, use_default=True):
 | 
					    def get_start_date(self):
 | 
				
			||||||
        if self.request.GET.get("startDate") != None:
 | 
					        if self.request.GET.get("startDate") != None:
 | 
				
			||||||
            found_time = timezone.datetime.strptime(
 | 
					            found_time = timezone.datetime.strptime(
 | 
				
			||||||
                self.request.GET.get("startDate"), "%Y-%m-%d"
 | 
					                self.request.GET.get("startDate"), "%Y-%m-%d"
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
            return timezone.make_aware(datetime.combine(found_time, time.min))
 | 
					            return timezone.make_aware(datetime.combine(found_time, time.min))
 | 
				
			||||||
        elif use_default == True:
 | 
					 | 
				
			||||||
            return timezone.now() - timezone.timedelta(days=30)
 | 
					 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            return None
 | 
					            return timezone.now() - timezone.timedelta(days=30)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def get_end_date(self):
 | 
					    def get_end_date(self):
 | 
				
			||||||
        if self.request.GET.get("endDate") != None:
 | 
					        if self.request.GET.get("endDate") != None:
 | 
				
			||||||
@ -29,6 +27,4 @@ class DateRangeMixin:
 | 
				
			|||||||
        data = super().get_context_data(**kwargs)
 | 
					        data = super().get_context_data(**kwargs)
 | 
				
			||||||
        data["start_date"] = self.get_start_date()
 | 
					        data["start_date"] = self.get_start_date()
 | 
				
			||||||
        data["end_date"] = self.get_end_date()
 | 
					        data["end_date"] = self.get_end_date()
 | 
				
			||||||
        start_date = self.get_start_date(False)
 | 
					 | 
				
			||||||
        data["date_query_params"] = f"?startDate={start_date.strftime('%Y-%m-%d')}&endDate={self.get_end_date().strftime('%Y-%m-%d')}" if start_date is not None else ""
 | 
					 | 
				
			||||||
        return data
 | 
					        return data
 | 
				
			||||||
 | 
				
			|||||||
@ -41,10 +41,8 @@
 | 
				
			|||||||
        <p class="ml-2 mb-1 supra font-medium text-gray-500 pointer-events-none">Services</p>
 | 
					        <p class="ml-2 mb-1 supra font-medium text-gray-500 pointer-events-none">Services</p>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        {% for service in user.owning_services.all %}
 | 
					        {% for service in user.owning_services.all %}
 | 
				
			||||||
        {% url 'dashboard:service' service.uuid as url %}
 | 
					        {% contextual_url 'dashboard:service' service.uuid as url %}
 | 
				
			||||||
        {% with url_full=date_query_params|default:''|prepend_string:url %}
 | 
					        {% include 'dashboard/includes/sidebar_portal.html' with label=service.name|truncatechars:16 url=url icon=service.link|iconify %}
 | 
				
			||||||
        {% include 'dashboard/includes/sidebar_portal.html' with label=service.name|truncatechars:16 url=url_full icon=service.link|iconify %}
 | 
					 | 
				
			||||||
        {% endwith %}
 | 
					 | 
				
			||||||
        {% endfor %}
 | 
					        {% endfor %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        {% endif %}
 | 
					        {% endif %}
 | 
				
			||||||
@ -62,7 +60,7 @@
 | 
				
			|||||||
        <p class="ml-2 mb-1 supra font-medium text-gray-500 pointer-events-none">Collaborations</p>
 | 
					        <p class="ml-2 mb-1 supra font-medium text-gray-500 pointer-events-none">Collaborations</p>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        {% for service in user.collaborating_services.all %}
 | 
					        {% for service in user.collaborating_services.all %}
 | 
				
			||||||
        {% url 'dashboard:service' service.uuid as url %}
 | 
					        {% contextual_url 'dashboard:service' service.uuid as url %}
 | 
				
			||||||
        {% include 'dashboard/includes/sidebar_portal.html' with label=service.name|truncatechars:20 url=url %}
 | 
					        {% include 'dashboard/includes/sidebar_portal.html' with label=service.name|truncatechars:20 url=url %}
 | 
				
			||||||
        {% endfor %}
 | 
					        {% endfor %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -2,7 +2,7 @@
 | 
				
			|||||||
    <input type="hidden" name="startDate" value="{{start_date.isoformat}}" id="startDate">
 | 
					    <input type="hidden" name="startDate" value="{{start_date.isoformat}}" id="startDate">
 | 
				
			||||||
    <input type="hidden" name="endDate" value="{{end_date.isoformat}}" id="endDate">
 | 
					    <input type="hidden" name="endDate" value="{{end_date.isoformat}}" id="endDate">
 | 
				
			||||||
</form>
 | 
					</form>
 | 
				
			||||||
<input type="input" id="rangePicker" placeholder="Date range" class="input ~neutral bg-neutral-000 cursor-pointer" readonly>
 | 
					<input type="input" id="rangePicker" placeholder="Date range" class="input ~neutral bg-neutral-000 cursor-pointer w-auto" readonly>
 | 
				
			||||||
<style>
 | 
					<style>
 | 
				
			||||||
    :root {
 | 
					    :root {
 | 
				
			||||||
        --litepickerMonthButtonHover: var(--color-urge);
 | 
					        --litepickerMonthButtonHover: var(--color-urge);
 | 
				
			||||||
@ -18,7 +18,7 @@
 | 
				
			|||||||
    var picker = new Litepicker({
 | 
					    var picker = new Litepicker({
 | 
				
			||||||
        element: document.getElementById('rangePicker'),
 | 
					        element: document.getElementById('rangePicker'),
 | 
				
			||||||
        singleMode: false,
 | 
					        singleMode: false,
 | 
				
			||||||
        format: 'MMM D, YYYY',
 | 
					        format: "MMM DD 'YY",
 | 
				
			||||||
        maxDate: new Date(),
 | 
					        maxDate: new Date(),
 | 
				
			||||||
        startDate: Date.parse(document.getElementById("startDate").getAttribute("value")),
 | 
					        startDate: Date.parse(document.getElementById("startDate").getAttribute("value")),
 | 
				
			||||||
        endDate: Date.parse(document.getElementById("endDate").getAttribute("value")),
 | 
					        endDate: Date.parse(document.getElementById("endDate").getAttribute("value")),
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,6 @@
 | 
				
			|||||||
{% load humanize helpers %}
 | 
					{% load humanize helpers %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<a class="card ~neutral !low service mb-6 p-0" href="{% url 'dashboard:service' object.uuid %}{{date_query_params}}">
 | 
					<a class="card ~neutral !low service mb-6 p-0" href="{% contextual_url 'dashboard:service' object.uuid %}">
 | 
				
			||||||
    {% with stats=object.stats %}
 | 
					    {% with stats=object.stats %}
 | 
				
			||||||
    <div class="p-4 md:flex justify-between">
 | 
					    <div class="p-4 md:flex justify-between">
 | 
				
			||||||
        <div class="flex items-center mb-4 md:mb-0">
 | 
					        <div class="flex items-center mb-4 md:mb-0">
 | 
				
			||||||
 | 
				
			|||||||
@ -12,7 +12,7 @@
 | 
				
			|||||||
        {% for session in object_list %}
 | 
					        {% for session in object_list %}
 | 
				
			||||||
        <tr>
 | 
					        <tr>
 | 
				
			||||||
            <td>
 | 
					            <td>
 | 
				
			||||||
                <a href="{% url 'dashboard:service_session' object.pk session.pk %}{{date_query_params}}"
 | 
					                <a href="{% contextual_url 'dashboard:service_session' object.pk session.pk %}"
 | 
				
			||||||
                    class="font-medium text-urge-700">
 | 
					                    class="font-medium text-urge-700">
 | 
				
			||||||
                    {{session.start_time|date:"M j Y, g:i a"|capfirst}}
 | 
					                    {{session.start_time|date:"M j Y, g:i a"|capfirst}}
 | 
				
			||||||
                    {% if session.is_currently_active %}
 | 
					                    {% if session.is_currently_active %}
 | 
				
			||||||
 | 
				
			|||||||
@ -6,7 +6,7 @@
 | 
				
			|||||||
<div class="mr-2">{% include 'dashboard/includes/date_range.html' %}</div>
 | 
					<div class="mr-2">{% include 'dashboard/includes/date_range.html' %}</div>
 | 
				
			||||||
{% has_perm 'core.change_service' user object as can_update %}
 | 
					{% has_perm 'core.change_service' user object as can_update %}
 | 
				
			||||||
{% if can_update %}
 | 
					{% if can_update %}
 | 
				
			||||||
<a href="{% url 'dashboard:service_update' service.uuid %}" class="button field bg-neutral-000 w-auto">Manage →</a>
 | 
					<a href="{% contextual_url 'dashboard:service_update' service.uuid %}" class="button field bg-neutral-000 w-auto">Manage →</a>
 | 
				
			||||||
{% endif %}
 | 
					{% endif %}
 | 
				
			||||||
{% endblock %}
 | 
					{% endblock %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -235,7 +235,7 @@
 | 
				
			|||||||
<div class="card ~neutral !low limited-height py-2">
 | 
					<div class="card ~neutral !low limited-height py-2">
 | 
				
			||||||
    {% include 'dashboard/includes/session_list.html' %}
 | 
					    {% include 'dashboard/includes/session_list.html' %}
 | 
				
			||||||
    <hr class="sep h-8">
 | 
					    <hr class="sep h-8">
 | 
				
			||||||
    <a href="{% url 'dashboard:service_session_list' service.uuid %}{{date_query_params}}" class="button ~neutral w-auto mb-2">View more
 | 
					    <a href="{% contextual_url 'dashboard:service_session_list' service.uuid %}" class="button ~neutral w-auto mb-2">View more
 | 
				
			||||||
        sessions
 | 
					        sessions
 | 
				
			||||||
        →</a>
 | 
					        →</a>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
{% block head_title %}{{object.name}} Session{% endblock %}
 | 
					{% block head_title %}{{object.name}} Session{% endblock %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{% block service_actions %}
 | 
					{% block service_actions %}
 | 
				
			||||||
<a href="{% url 'dashboard:service' object.uuid %}" class="button field bg-neutral-000 w-auto">Analytics →</a>
 | 
					<a href="{% contextual_url 'dashboard:service' object.uuid %}" class="button field bg-neutral-000 w-auto">Analytics →</a>
 | 
				
			||||||
{% endblock %}
 | 
					{% endblock %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{% block service_content %}
 | 
					{% block service_content %}
 | 
				
			||||||
 | 
				
			|||||||
@ -6,7 +6,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
{% block service_actions %}
 | 
					{% block service_actions %}
 | 
				
			||||||
<div class="mr-2">{% include 'dashboard/includes/date_range.html' %}</div>
 | 
					<div class="mr-2">{% include 'dashboard/includes/date_range.html' %}</div>
 | 
				
			||||||
<a href="{% url 'dashboard:service' object.uuid %}{{date_query_params}}" class="button field ~neutral bg-neutral-000 w-auto">Analytics →</a>
 | 
					<a href="{% contextual_url 'dashboard:service' object.uuid %}" class="button field ~neutral bg-neutral-000 w-auto">Analytics →</a>
 | 
				
			||||||
{% endblock %}
 | 
					{% endblock %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{% block service_content %}
 | 
					{% block service_content %}
 | 
				
			||||||
 | 
				
			|||||||
@ -6,7 +6,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
{% block content %}
 | 
					{% block content %}
 | 
				
			||||||
<div class="md:flex justify-between items-center" id="heading">
 | 
					<div class="md:flex justify-between items-center" id="heading">
 | 
				
			||||||
    <a class="flex items-center mb-4 md:mb-0" href="{% url 'dashboard:service' object.uuid %}{{date_query_params}}">
 | 
					    <a class="flex items-center mb-4 md:mb-0" href="{% contextual_url 'dashboard:service' object.uuid %}">
 | 
				
			||||||
        <h3 class="heading leading-none mr-4">
 | 
					        <h3 class="heading leading-none mr-4">
 | 
				
			||||||
            {{object.link|iconify}}
 | 
					            {{object.link|iconify}}
 | 
				
			||||||
            {{object.name}}
 | 
					            {{object.name}}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,6 @@
 | 
				
			|||||||
from datetime import timedelta
 | 
					from datetime import timedelta
 | 
				
			||||||
from urllib.parse import urlparse
 | 
					from urllib.parse import urlparse
 | 
				
			||||||
 | 
					import urllib
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import flag
 | 
					import flag
 | 
				
			||||||
import pycountry
 | 
					import pycountry
 | 
				
			||||||
@ -8,6 +9,7 @@ from django.conf import settings
 | 
				
			|||||||
from django.utils import timezone
 | 
					from django.utils import timezone
 | 
				
			||||||
from django.utils.html import escape
 | 
					from django.utils.html import escape
 | 
				
			||||||
from django.utils.safestring import SafeString
 | 
					from django.utils.safestring import SafeString
 | 
				
			||||||
 | 
					from django.template.defaulttags import url as url_tag
 | 
				
			||||||
 | 
					
 | 
				
			||||||
register = template.Library()
 | 
					register = template.Library()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -185,6 +187,42 @@ def urldisplay(url):
 | 
				
			|||||||
    else:
 | 
					    else:
 | 
				
			||||||
        return url
 | 
					        return url
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@register.filter
 | 
					class ContextualURLNode(template.Node):
 | 
				
			||||||
def prepend_string(arg1, arg2):
 | 
					    """Extension of the Django URLNode to support including contextual parameters in URL outputs. In other words, URLs generated will keep the start and end date parameters."""
 | 
				
			||||||
    return f"{str(arg2)}{str(arg1)}"
 | 
					
 | 
				
			||||||
 | 
					    CONTEXT_PARAMS = ["startDate", "endDate"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __init__(self, urlnode):
 | 
				
			||||||
 | 
					        self.urlnode = urlnode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __repr__(self):
 | 
				
			||||||
 | 
					        return self.urlnode.__repr__()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def render(self, context):
 | 
				
			||||||
 | 
					        url = self.urlnode.render(context)
 | 
				
			||||||
 | 
					        if self.urlnode.asvar:
 | 
				
			||||||
 | 
					            url = context[self.urlnode.asvar]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        url_parts = list(urlparse(url))
 | 
				
			||||||
 | 
					        query = dict(urllib.parse.parse_qsl(url_parts[4]))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        query.update({
 | 
				
			||||||
 | 
					            param: context.request.GET.get(param) for param in self.CONTEXT_PARAMS if param in context.request.GET and param not in query
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        url_parts[4] = urllib.parse.urlencode(query)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        url_final = urllib.parse.urlunparse(url_parts)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if self.urlnode.asvar:
 | 
				
			||||||
 | 
					            context[self.urlnode.asvar] = url_final
 | 
				
			||||||
 | 
					            return ''
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            return url_final
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@register.tag
 | 
				
			||||||
 | 
					def contextual_url(*args, **kwargs):
 | 
				
			||||||
 | 
					    urlnode = url_tag(*args, **kwargs)
 | 
				
			||||||
 | 
					    return ContextualURLNode(urlnode)
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user