mirror of
https://github.com/inventree/InvenTree.git
synced 2025-04-30 04:26:44 +00:00
Merge pull request #2685 from SchrodingersGat/date-format
Adds a user-configurable setting to configure how dates are displayed
This commit is contained in:
commit
a30e478412
@ -151,7 +151,7 @@ src="{% static 'img/blank_image.png' %}"
|
|||||||
{% trans "Target Date" %}
|
{% trans "Target Date" %}
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
{{ build.target_date }}
|
{% render_date build.target_date %}
|
||||||
{% if build.is_overdue %}
|
{% if build.is_overdue %}
|
||||||
<span title='{% blocktrans with target=build.target_date %}This build was due on {{target}}{% endblocktrans %}' class='badge badge-right rounded-pill bg-danger'>{% trans "Overdue" %}</span>
|
<span title='{% blocktrans with target=build.target_date %}This build was due on {{target}}{% endblocktrans %}' class='badge badge-right rounded-pill bg-danger'>{% trans "Overdue" %}</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
<div class='panel-content'>
|
<div class='panel-content'>
|
||||||
<div class='row'>
|
<div class='row'>
|
||||||
<div class='col-sm-6'>
|
<div class='col-sm-6'>
|
||||||
<table class='table table-striped'>
|
<table class='table table-striped table-condensed'>
|
||||||
<col width='25'>
|
<col width='25'>
|
||||||
<tr>
|
<tr>
|
||||||
<td><span class='fas fa-info'></span></td>
|
<td><span class='fas fa-info'></span></td>
|
||||||
@ -120,19 +120,19 @@
|
|||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<div class='col-sm-6'>
|
<div class='col-sm-6'>
|
||||||
<table class='table table-striped'>
|
<table class='table table-striped table-condensed'>
|
||||||
<col width='25'>
|
<col width='25'>
|
||||||
<tr>
|
<tr>
|
||||||
<td><span class='fas fa-calendar-alt'></span></td>
|
<td><span class='fas fa-calendar-alt'></span></td>
|
||||||
<td>{% trans "Created" %}</td>
|
<td>{% trans "Created" %}</td>
|
||||||
<td>{{ build.creation_date }}</td>
|
<td>{% render_date build.creation_date %}</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><span class='fas fa-calendar-alt'></span></td>
|
<td><span class='fas fa-calendar-alt'></span></td>
|
||||||
<td>{% trans "Target Date" %}</td>
|
<td>{% trans "Target Date" %}</td>
|
||||||
{% if build.target_date %}
|
{% if build.target_date %}
|
||||||
<td>
|
<td>
|
||||||
{{ build.target_date }}{% if build.is_overdue %} <span class='fas fa-calendar-times icon-red'></span>{% endif %}
|
{% render_date build.target_date %}{% if build.is_overdue %} <span class='fas fa-calendar-times icon-red'></span>{% endif %}
|
||||||
</td>
|
</td>
|
||||||
{% else %}
|
{% else %}
|
||||||
<td><em>{% trans "No target date set" %}</em></td>
|
<td><em>{% trans "No target date set" %}</em></td>
|
||||||
@ -142,7 +142,7 @@
|
|||||||
<td><span class='fas fa-calendar-alt'></span></td>
|
<td><span class='fas fa-calendar-alt'></span></td>
|
||||||
<td>{% trans "Completed" %}</td>
|
<td>{% trans "Completed" %}</td>
|
||||||
{% if build.completion_date %}
|
{% if build.completion_date %}
|
||||||
<td>{{ build.completion_date }}{% if build.completed_by %}<span class='badge badge-right rounded-pill bg-dark'>{{ build.completed_by }}</span>{% endif %}</td>
|
<td>{% render_date build.completion_date %}{% if build.completed_by %}<span class='badge badge-right rounded-pill bg-dark'>{{ build.completed_by }}</span>{% endif %}</td>
|
||||||
{% else %}
|
{% else %}
|
||||||
<td><em>{% trans "Build not complete" %}</em></td>
|
<td><em>{% trans "Build not complete" %}</em></td>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
@ -443,12 +443,12 @@ class BaseInvenTreeSetting(models.Model):
|
|||||||
except self.DoesNotExist:
|
except self.DoesNotExist:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def choices(self):
|
def choices(self, **kwargs):
|
||||||
"""
|
"""
|
||||||
Return the available choices for this setting (or None if no choices are defined)
|
Return the available choices for this setting (or None if no choices are defined)
|
||||||
"""
|
"""
|
||||||
|
|
||||||
return self.__class__.get_setting_choices(self.key)
|
return self.__class__.get_setting_choices(self.key, **kwargs)
|
||||||
|
|
||||||
def valid_options(self):
|
def valid_options(self):
|
||||||
"""
|
"""
|
||||||
@ -462,6 +462,33 @@ class BaseInvenTreeSetting(models.Model):
|
|||||||
|
|
||||||
return [opt[0] for opt in choices]
|
return [opt[0] for opt in choices]
|
||||||
|
|
||||||
|
def is_choice(self, **kwargs):
|
||||||
|
"""
|
||||||
|
Check if this setting is a "choice" field
|
||||||
|
"""
|
||||||
|
|
||||||
|
return self.__class__.get_setting_choices(self.key, **kwargs) is not None
|
||||||
|
|
||||||
|
def as_choice(self, **kwargs):
|
||||||
|
"""
|
||||||
|
Render this setting as the "display" value of a choice field,
|
||||||
|
e.g. if the choices are:
|
||||||
|
[('A4', 'A4 paper'), ('A3', 'A3 paper')],
|
||||||
|
and the value is 'A4',
|
||||||
|
then display 'A4 paper'
|
||||||
|
"""
|
||||||
|
|
||||||
|
choices = self.get_setting_choices(self.key, **kwargs)
|
||||||
|
|
||||||
|
if not choices:
|
||||||
|
return self.value
|
||||||
|
|
||||||
|
for value, display in choices:
|
||||||
|
if value == self.value:
|
||||||
|
return display
|
||||||
|
|
||||||
|
return self.value
|
||||||
|
|
||||||
def is_bool(self, **kwargs):
|
def is_bool(self, **kwargs):
|
||||||
"""
|
"""
|
||||||
Check if this setting is required to be a boolean value
|
Check if this setting is required to be a boolean value
|
||||||
@ -1212,6 +1239,21 @@ class InvenTreeUserSetting(BaseInvenTreeSetting):
|
|||||||
'default': False,
|
'default': False,
|
||||||
'validator': bool,
|
'validator': bool,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
'DATE_DISPLAY_FORMAT': {
|
||||||
|
'name': _('Date Format'),
|
||||||
|
'description': _('Preferred format for displaying dates'),
|
||||||
|
'default': 'YYYY-MM-DD',
|
||||||
|
'choices': [
|
||||||
|
('YYYY-MM-DD', '2022-02-22'),
|
||||||
|
('YYYY/MM/DD', '2022/22/22'),
|
||||||
|
('DD-MM-YYYY', '22-02-2022'),
|
||||||
|
('DD/MM/YYYY', '22/02/2022'),
|
||||||
|
('MM-DD-YYYY', '02-22-2022'),
|
||||||
|
('MM/DD/YYYY', '02/22/2022'),
|
||||||
|
('MMM DD YYYY', 'Feb 22 2022'),
|
||||||
|
]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
@ -141,27 +141,27 @@ src="{% static 'img/blank_image.png' %}"
|
|||||||
<tr>
|
<tr>
|
||||||
<td><span class='fas fa-calendar-alt'></span></td>
|
<td><span class='fas fa-calendar-alt'></span></td>
|
||||||
<td>{% trans "Created" %}</td>
|
<td>{% trans "Created" %}</td>
|
||||||
<td>{{ order.creation_date }}<span class='badge badge-right rounded-pill bg-dark'>{{ order.created_by }}</span></td>
|
<td>{% render_date order.creation_date %}<span class='badge badge-right rounded-pill bg-dark'>{{ order.created_by }}</span></td>
|
||||||
</tr>
|
</tr>
|
||||||
{% if order.issue_date %}
|
{% if order.issue_date %}
|
||||||
<tr>
|
<tr>
|
||||||
<td><span class='fas fa-calendar-alt'></span></td>
|
<td><span class='fas fa-calendar-alt'></span></td>
|
||||||
<td>{% trans "Issued" %}</td>
|
<td>{% trans "Issued" %}</td>
|
||||||
<td>{{ order.issue_date }}</td>
|
<td>{% render_date order.issue_date %}</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if order.target_date %}
|
{% if order.target_date %}
|
||||||
<tr>
|
<tr>
|
||||||
<td><span class='fas fa-calendar-alt'></span></td>
|
<td><span class='fas fa-calendar-alt'></span></td>
|
||||||
<td>{% trans "Target Date" %}</td>
|
<td>{% trans "Target Date" %}</td>
|
||||||
<td>{{ order.target_date }}</td>
|
<td>{% render_date order.target_date %}</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if order.status == PurchaseOrderStatus.COMPLETE %}
|
{% if order.status == PurchaseOrderStatus.COMPLETE %}
|
||||||
<tr>
|
<tr>
|
||||||
<td><span class='fas fa-calendar-alt'></span></td>
|
<td><span class='fas fa-calendar-alt'></span></td>
|
||||||
<td>{% trans "Received" %}</td>
|
<td>{% trans "Received" %}</td>
|
||||||
<td>{{ order.complete_date }}<span class='badge badge-right rounded-pill bg-dark'>{{ order.received_by }}</span></td>
|
<td>{% render_date order.complete_date %}<span class='badge badge-right rounded-pill bg-dark'>{{ order.received_by }}</span></td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if order.responsible %}
|
{% if order.responsible %}
|
||||||
|
@ -155,13 +155,13 @@ src="{% static 'img/blank_image.png' %}"
|
|||||||
<tr>
|
<tr>
|
||||||
<td><span class='fas fa-calendar-alt'></span></td>
|
<td><span class='fas fa-calendar-alt'></span></td>
|
||||||
<td>{% trans "Created" %}</td>
|
<td>{% trans "Created" %}</td>
|
||||||
<td>{{ order.creation_date }}<span class='badge badge-right rounded-pill bg-dark'>{{ order.created_by }}</span></td>
|
<td>{% render_date order.creation_date %}<span class='badge badge-right rounded-pill bg-dark'>{{ order.created_by }}</span></td>
|
||||||
</tr>
|
</tr>
|
||||||
{% if order.target_date %}
|
{% if order.target_date %}
|
||||||
<tr>
|
<tr>
|
||||||
<td><span class='fas fa-calendar-alt'></span></td>
|
<td><span class='fas fa-calendar-alt'></span></td>
|
||||||
<td>{% trans "Target Date" %}</td>
|
<td>{% trans "Target Date" %}</td>
|
||||||
<td>{{ order.target_date }}</td>
|
<td>{% render_date order.target_date %}</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if order.shipment_date %}
|
{% if order.shipment_date %}
|
||||||
@ -169,7 +169,7 @@ src="{% static 'img/blank_image.png' %}"
|
|||||||
<td><span class='fas fa-truck'></span></td>
|
<td><span class='fas fa-truck'></span></td>
|
||||||
<td>{% trans "Completed" %}</td>
|
<td>{% trans "Completed" %}</td>
|
||||||
<td>
|
<td>
|
||||||
{{ order.shipment_date }}
|
{% render_date order.shipment_date %}
|
||||||
{% if order.shipped_by %}
|
{% if order.shipped_by %}
|
||||||
<span class='badge badge-right rounded-pill bg-dark'>{{ order.shipped_by }}</span>
|
<span class='badge badge-right rounded-pill bg-dark'>{{ order.shipped_by }}</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
@ -952,7 +952,7 @@
|
|||||||
{% if price_history %}
|
{% if price_history %}
|
||||||
var purchasepricedata = {
|
var purchasepricedata = {
|
||||||
labels: [
|
labels: [
|
||||||
{% for line in price_history %}'{{ line.date }}',{% endfor %}
|
{% for line in price_history %}'{% render_date line.date %}',{% endfor %}
|
||||||
],
|
],
|
||||||
datasets: [{
|
datasets: [{
|
||||||
label: '{% blocktrans %}Purchase Unit Price - {{currency}}{% endblocktrans %}',
|
label: '{% blocktrans %}Purchase Unit Price - {{currency}}{% endblocktrans %}',
|
||||||
@ -1065,7 +1065,7 @@
|
|||||||
{% if sale_history %}
|
{% if sale_history %}
|
||||||
var salepricedata = {
|
var salepricedata = {
|
||||||
labels: [
|
labels: [
|
||||||
{% for line in sale_history %}'{{ line.date }}',{% endfor %}
|
{% for line in sale_history %}'{% render_date line.date %}',{% endfor %}
|
||||||
],
|
],
|
||||||
datasets: [{
|
datasets: [{
|
||||||
label: '{% blocktrans %}Unit Price - {{currency}}{% endblocktrans %}',
|
label: '{% blocktrans %}Unit Price - {{currency}}{% endblocktrans %}',
|
||||||
|
@ -312,7 +312,7 @@
|
|||||||
<td><span class='fas fa-calendar-alt'></span></td>
|
<td><span class='fas fa-calendar-alt'></span></td>
|
||||||
<td>{% trans "Creation Date" %}</td>
|
<td>{% trans "Creation Date" %}</td>
|
||||||
<td>
|
<td>
|
||||||
{{ part.creation_date }}
|
{% render_date part.creation_date %}
|
||||||
{% if part.creation_user %}
|
{% if part.creation_user %}
|
||||||
<span class='badge badge-right rounded-pill bg-dark'>{{ part.creation_user }}</span>
|
<span class='badge badge-right rounded-pill bg-dark'>{{ part.creation_user }}</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
@ -5,6 +5,7 @@ This module provides template tags for extra functionality,
|
|||||||
over and above the built-in Django tags.
|
over and above the built-in Django tags.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
from datetime import date
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
@ -43,6 +44,52 @@ def define(value, *args, **kwargs):
|
|||||||
return value
|
return value
|
||||||
|
|
||||||
|
|
||||||
|
@register.simple_tag(takes_context=True)
|
||||||
|
def render_date(context, date_object):
|
||||||
|
"""
|
||||||
|
Renders a date according to the preference of the provided user
|
||||||
|
|
||||||
|
Note that the user preference is stored using the formatting adopted by moment.js,
|
||||||
|
which differs from the python formatting!
|
||||||
|
"""
|
||||||
|
|
||||||
|
if date_object is None:
|
||||||
|
return None
|
||||||
|
|
||||||
|
if type(date_object) == str:
|
||||||
|
# If a string is passed, first convert it to a datetime
|
||||||
|
date_object = date.fromisoformat(date_object)
|
||||||
|
|
||||||
|
# We may have already pre-cached the date format by calling this already!
|
||||||
|
user_date_format = context.get('user_date_format', None)
|
||||||
|
|
||||||
|
if user_date_format is None:
|
||||||
|
|
||||||
|
user = context.get('user', None)
|
||||||
|
|
||||||
|
if user:
|
||||||
|
# User is specified - look for their date display preference
|
||||||
|
user_date_format = InvenTreeUserSetting.get_setting('DATE_DISPLAY_FORMAT', user=user)
|
||||||
|
else:
|
||||||
|
user_date_format = 'YYYY-MM-DD'
|
||||||
|
|
||||||
|
# Convert the format string to Pythonic equivalent
|
||||||
|
replacements = [
|
||||||
|
('YYYY', '%Y'),
|
||||||
|
('MMM', '%b'),
|
||||||
|
('MM', '%m'),
|
||||||
|
('DD', '%d'),
|
||||||
|
]
|
||||||
|
|
||||||
|
for o, n in replacements:
|
||||||
|
user_date_format = user_date_format.replace(o, n)
|
||||||
|
|
||||||
|
# Update the context cache
|
||||||
|
context['user_date_format'] = user_date_format
|
||||||
|
|
||||||
|
return date_object.strftime(user_date_format)
|
||||||
|
|
||||||
|
|
||||||
@register.simple_tag()
|
@register.simple_tag()
|
||||||
def decimal(x, *args, **kwargs):
|
def decimal(x, *args, **kwargs):
|
||||||
""" Simplified rendering of a decimal number """
|
""" Simplified rendering of a decimal number """
|
||||||
|
@ -120,13 +120,13 @@ content: "v{{report_revision}} - {{ date.isoformat }}";
|
|||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th>{% trans "Issued" %}</th>
|
<th>{% trans "Issued" %}</th>
|
||||||
<td>{{ build.creation_date }}</td>
|
<td>{% render_date build.creation_date %}</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th>{% trans "Target Date" %}</th>
|
<th>{% trans "Target Date" %}</th>
|
||||||
<td>
|
<td>
|
||||||
{% if build.target_date %}
|
{% if build.target_date %}
|
||||||
{{ build.target_date }}
|
{% render_date build.target_date %}
|
||||||
{% else %}
|
{% else %}
|
||||||
<em>Not specified</em>
|
<em>Not specified</em>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
@ -187,7 +187,7 @@
|
|||||||
<td><span class='fas fa-calendar-alt{% if item.is_expired %} icon-red{% endif %}'></span></td>
|
<td><span class='fas fa-calendar-alt{% if item.is_expired %} icon-red{% endif %}'></span></td>
|
||||||
<td>{% trans "Expiry Date" %}</td>
|
<td>{% trans "Expiry Date" %}</td>
|
||||||
<td>
|
<td>
|
||||||
{{ item.expiry_date }}
|
{% render_date item.expiry_date %}
|
||||||
{% if item.is_expired %}
|
{% if item.is_expired %}
|
||||||
<span title='{% blocktrans %}This StockItem expired on {{ item.expiry_date }}{% endblocktrans %}' class='badge rounded-pill bg-danger badge-right'>{% trans "Expired" %}</span>
|
<span title='{% blocktrans %}This StockItem expired on {{ item.expiry_date }}{% endblocktrans %}' class='badge rounded-pill bg-danger badge-right'>{% trans "Expired" %}</span>
|
||||||
{% elif item.is_stale %}
|
{% elif item.is_stale %}
|
||||||
@ -205,7 +205,7 @@
|
|||||||
<td><span class='fas fa-calendar-alt'></span></td>
|
<td><span class='fas fa-calendar-alt'></span></td>
|
||||||
<td>{% trans "Last Stocktake" %}</td>
|
<td>{% trans "Last Stocktake" %}</td>
|
||||||
{% if item.stocktake_date %}
|
{% if item.stocktake_date %}
|
||||||
<td>{{ item.stocktake_date }} <span class='badge badge-right rounded-pill bg-dark'>{{ item.stocktake_user }}</span></td>
|
<td>{% render_date item.stocktake_date %} <span class='badge badge-right rounded-pill bg-dark'>{{ item.stocktake_user }}</span></td>
|
||||||
{% else %}
|
{% else %}
|
||||||
<td><em>{% trans "No stocktake performed" %}</em></td>
|
<td><em>{% trans "No stocktake performed" %}</em></td>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
@ -81,7 +81,7 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
</td>
|
</td>
|
||||||
<td>{{ plugin.author }}</td>
|
<td>{{ plugin.author }}</td>
|
||||||
<td>{{ plugin.pub_date }}</td>
|
<td>{% render_date plugin.pub_date %}</td>
|
||||||
<td>{% if plugin.version %}{{ plugin.version }}{% endif %}</td>
|
<td>{% if plugin.version %}{{ plugin.version }}{% endif %}</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
@ -36,7 +36,7 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<td><span class='fas fa-calendar-alt'></span></td>
|
<td><span class='fas fa-calendar-alt'></span></td>
|
||||||
<td>{% trans "Date" %}</td>
|
<td>{% trans "Date" %}</td>
|
||||||
<td>{{ plugin.pub_date }}{% include "clip.html" %}</td>
|
<td>{% render_date plugin.pub_date %}{% include "clip.html" %}</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><span class='fas fa-hashtag'></span></td>
|
<td><span class='fas fa-hashtag'></span></td>
|
||||||
@ -101,7 +101,7 @@
|
|||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><span class='fas fa-calendar-alt'></span></td>
|
<td><span class='fas fa-calendar-alt'></span></td>
|
||||||
<td>{% trans "Commit Date" %}</td><td>{{ plugin.package.date }}{% include "clip.html" %}</td>
|
<td>{% trans "Commit Date" %}</td><td>{% render_date plugin.package.date %}{% include "clip.html" %}</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><span class='fas fa-code-branch'></span></td>
|
<td><span class='fas fa-code-branch'></span></td>
|
||||||
|
@ -28,7 +28,11 @@
|
|||||||
<div id='setting-{{ setting.pk }}'>
|
<div id='setting-{{ setting.pk }}'>
|
||||||
<span id='setting-value-{{ setting.key.upper }}' fieldname='{{ setting.key.upper }}'>
|
<span id='setting-value-{{ setting.key.upper }}' fieldname='{{ setting.key.upper }}'>
|
||||||
{% if setting.value %}
|
{% if setting.value %}
|
||||||
|
{% if setting.is_choice %}
|
||||||
|
<strong>{{ setting.as_choice }}</strong>
|
||||||
|
{% else %}
|
||||||
<strong>{{ setting.value }}</strong>
|
<strong>{{ setting.value }}</strong>
|
||||||
|
{% endif %}
|
||||||
{% else %}
|
{% else %}
|
||||||
<em style='color: #855;'>{% trans "No value set" %}</em>
|
<em style='color: #855;'>{% trans "No value set" %}</em>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
<table class='table table-striped table-condensed'>
|
<table class='table table-striped table-condensed'>
|
||||||
<tbody>
|
<tbody>
|
||||||
{% include "InvenTree/settings/setting.html" with key="STICKY_HEADER" icon="fa-bars" user_setting=True %}
|
{% include "InvenTree/settings/setting.html" with key="STICKY_HEADER" icon="fa-bars" user_setting=True %}
|
||||||
|
{% include "InvenTree/settings/setting.html" with key="DATE_DISPLAY_FORMAT" icon="fa-calendar-alt" user_setting=True %}
|
||||||
{% include "InvenTree/settings/setting.html" with key="FORMS_CLOSE_USING_ESCAPE" icon="fa-window-close" user_setting=True %}
|
{% include "InvenTree/settings/setting.html" with key="FORMS_CLOSE_USING_ESCAPE" icon="fa-window-close" user_setting=True %}
|
||||||
{% include "InvenTree/settings/setting.html" with key="PART_SHOW_QUANTITY_IN_FORMS" icon="fa-hashtag" user_setting=True %}
|
{% include "InvenTree/settings/setting.html" with key="PART_SHOW_QUANTITY_IN_FORMS" icon="fa-hashtag" user_setting=True %}
|
||||||
</tbody>
|
</tbody>
|
||||||
|
@ -44,7 +44,7 @@
|
|||||||
{% if commit_date %}
|
{% if commit_date %}
|
||||||
<tr>
|
<tr>
|
||||||
<td><span class='fas fa-calendar-alt'></span></td>
|
<td><span class='fas fa-calendar-alt'></span></td>
|
||||||
<td>{% trans "Commit Date" %}</td><td>{{ commit_date }}{% include "clip.html" %}</td>
|
<td>{% trans "Commit Date" %}</td><td>{% render_date commit_date %}{% include "clip.html" %}</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
clearEvents,
|
clearEvents,
|
||||||
endDate,
|
endDate,
|
||||||
startDate,
|
startDate,
|
||||||
|
renderDate,
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -32,3 +33,33 @@ function clearEvents(calendar) {
|
|||||||
event.remove();
|
event.remove();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Render the provided date in the user-specified format.
|
||||||
|
*
|
||||||
|
* The provided "date" variable is a string, nominally ISO format e.g. 2022-02-22
|
||||||
|
* The user-configured setting DATE_DISPLAY_FORMAT determines how the date should be displayed.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function renderDate(date, options={}) {
|
||||||
|
|
||||||
|
if (!date) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
var fmt = user_settings.DATE_DISPLAY_FORMAT || 'YYYY-MM-DD';
|
||||||
|
|
||||||
|
if (options.showTime) {
|
||||||
|
fmt += ' HH:mm';
|
||||||
|
}
|
||||||
|
|
||||||
|
var m = moment(date);
|
||||||
|
|
||||||
|
if (m.isValid()) {
|
||||||
|
return m.format(fmt);
|
||||||
|
} else {
|
||||||
|
// Invalid input string, simply return provided value
|
||||||
|
return date;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -40,12 +40,15 @@ function editSetting(pk, options={}) {
|
|||||||
url = `/api/settings/user/${pk}/`;
|
url = `/api/settings/user/${pk}/`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var reload_required = false;
|
||||||
|
|
||||||
// First, read the settings object from the server
|
// First, read the settings object from the server
|
||||||
inventreeGet(url, {}, {
|
inventreeGet(url, {}, {
|
||||||
success: function(response) {
|
success: function(response) {
|
||||||
|
|
||||||
if (response.choices && response.choices.length > 0) {
|
if (response.choices && response.choices.length > 0) {
|
||||||
response.type = 'choice';
|
response.type = 'choice';
|
||||||
|
reload_required = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Construct the field
|
// Construct the field
|
||||||
@ -89,7 +92,9 @@ function editSetting(pk, options={}) {
|
|||||||
|
|
||||||
var setting = response.key;
|
var setting = response.key;
|
||||||
|
|
||||||
if (response.type == 'boolean') {
|
if (reload_required) {
|
||||||
|
location.reload();
|
||||||
|
} else if (response.type == 'boolean') {
|
||||||
var enabled = response.value.toString().toLowerCase() == 'true';
|
var enabled = response.value.toString().toLowerCase() == 'true';
|
||||||
$(`#setting-value-${setting}`).prop('checked', enabled);
|
$(`#setting-value-${setting}`).prop('checked', enabled);
|
||||||
} else {
|
} else {
|
||||||
|
@ -165,6 +165,9 @@ function loadAttachmentTable(url, options) {
|
|||||||
{
|
{
|
||||||
field: 'upload_date',
|
field: 'upload_date',
|
||||||
title: '{% trans "Upload Date" %}',
|
title: '{% trans "Upload Date" %}',
|
||||||
|
formatter: function(value) {
|
||||||
|
return renderDate(value);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
field: 'actions',
|
field: 'actions',
|
||||||
|
@ -1961,6 +1961,9 @@ function loadBuildTable(table, options) {
|
|||||||
field: 'creation_date',
|
field: 'creation_date',
|
||||||
title: '{% trans "Created" %}',
|
title: '{% trans "Created" %}',
|
||||||
sortable: true,
|
sortable: true,
|
||||||
|
formatter: function(value) {
|
||||||
|
return renderDate(value);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
field: 'issued_by',
|
field: 'issued_by',
|
||||||
@ -1990,11 +1993,17 @@ function loadBuildTable(table, options) {
|
|||||||
field: 'target_date',
|
field: 'target_date',
|
||||||
title: '{% trans "Target Date" %}',
|
title: '{% trans "Target Date" %}',
|
||||||
sortable: true,
|
sortable: true,
|
||||||
|
formatter: function(value) {
|
||||||
|
return renderDate(value);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
field: 'completion_date',
|
field: 'completion_date',
|
||||||
title: '{% trans "Completion Date" %}',
|
title: '{% trans "Completion Date" %}',
|
||||||
sortable: true,
|
sortable: true,
|
||||||
|
formatter: function(value) {
|
||||||
|
return renderDate(value);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
@ -923,11 +923,17 @@ function loadPurchaseOrderTable(table, options) {
|
|||||||
field: 'creation_date',
|
field: 'creation_date',
|
||||||
title: '{% trans "Date" %}',
|
title: '{% trans "Date" %}',
|
||||||
sortable: true,
|
sortable: true,
|
||||||
|
formatter: function(value) {
|
||||||
|
return renderDate(value);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
field: 'target_date',
|
field: 'target_date',
|
||||||
title: '{% trans "Target Date" %}',
|
title: '{% trans "Target Date" %}',
|
||||||
sortable: true,
|
sortable: true,
|
||||||
|
formatter: function(value) {
|
||||||
|
return renderDate(value);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
field: 'line_items',
|
field: 'line_items',
|
||||||
@ -1198,7 +1204,7 @@ function loadPurchaseOrderLineItemTable(table, options={}) {
|
|||||||
title: '{% trans "Target Date" %}',
|
title: '{% trans "Target Date" %}',
|
||||||
formatter: function(value, row) {
|
formatter: function(value, row) {
|
||||||
if (row.target_date) {
|
if (row.target_date) {
|
||||||
var html = row.target_date;
|
var html = renderDate(row.target_date);
|
||||||
|
|
||||||
if (row.overdue) {
|
if (row.overdue) {
|
||||||
html += `<span class='fas fa-calendar-alt icon-red float-right' title='{% trans "This line item is overdue" %}'></span>`;
|
html += `<span class='fas fa-calendar-alt icon-red float-right' title='{% trans "This line item is overdue" %}'></span>`;
|
||||||
@ -1207,7 +1213,7 @@ function loadPurchaseOrderLineItemTable(table, options={}) {
|
|||||||
return html;
|
return html;
|
||||||
|
|
||||||
} else if (row.order_detail && row.order_detail.target_date) {
|
} else if (row.order_detail && row.order_detail.target_date) {
|
||||||
return `<em>${row.order_detail.target_date}</em>`;
|
return `<em>${renderDate(row.order_detail.target_date)}</em>`;
|
||||||
} else {
|
} else {
|
||||||
return '-';
|
return '-';
|
||||||
}
|
}
|
||||||
@ -1371,16 +1377,25 @@ function loadSalesOrderTable(table, options) {
|
|||||||
sortable: true,
|
sortable: true,
|
||||||
field: 'creation_date',
|
field: 'creation_date',
|
||||||
title: '{% trans "Creation Date" %}',
|
title: '{% trans "Creation Date" %}',
|
||||||
|
formatter: function(value) {
|
||||||
|
return renderDate(value);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
sortable: true,
|
sortable: true,
|
||||||
field: 'target_date',
|
field: 'target_date',
|
||||||
title: '{% trans "Target Date" %}',
|
title: '{% trans "Target Date" %}',
|
||||||
|
formatter: function(value) {
|
||||||
|
return renderDate(value);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
sortable: true,
|
sortable: true,
|
||||||
field: 'shipment_date',
|
field: 'shipment_date',
|
||||||
title: '{% trans "Shipment Date" %}',
|
title: '{% trans "Shipment Date" %}',
|
||||||
|
formatter: function(value) {
|
||||||
|
return renderDate(value);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
sortable: true,
|
sortable: true,
|
||||||
@ -1532,9 +1547,9 @@ function loadSalesOrderShipmentTable(table, options={}) {
|
|||||||
sortable: true,
|
sortable: true,
|
||||||
formatter: function(value, row) {
|
formatter: function(value, row) {
|
||||||
if (value) {
|
if (value) {
|
||||||
return value;
|
return renderDate(value);
|
||||||
} else {
|
} else {
|
||||||
return '{% trans "Not shipped" %}';
|
return '<em>{% trans "Not shipped" %}</em>';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -2317,7 +2332,7 @@ function loadSalesOrderLineItemTable(table, options={}) {
|
|||||||
switchable: true,
|
switchable: true,
|
||||||
formatter: function(value, row) {
|
formatter: function(value, row) {
|
||||||
if (row.target_date) {
|
if (row.target_date) {
|
||||||
var html = row.target_date;
|
var html = renderDate(row.target_date);
|
||||||
|
|
||||||
if (row.overdue) {
|
if (row.overdue) {
|
||||||
html += `<span class='fas fa-calendar-alt icon-red float-right' title='{% trans "This line item is overdue" %}'></span>`;
|
html += `<span class='fas fa-calendar-alt icon-red float-right' title='{% trans "This line item is overdue" %}'></span>`;
|
||||||
@ -2326,7 +2341,7 @@ function loadSalesOrderLineItemTable(table, options={}) {
|
|||||||
return html;
|
return html;
|
||||||
|
|
||||||
} else if (row.order_detail && row.order_detail.target_date) {
|
} else if (row.order_detail && row.order_detail.target_date) {
|
||||||
return `<em>${row.order_detail.target_date}</em>`;
|
return `<em>${renderDate(row.order_detail.target_date)}</em>`;
|
||||||
} else {
|
} else {
|
||||||
return '-';
|
return '-';
|
||||||
}
|
}
|
||||||
|
@ -25,7 +25,6 @@
|
|||||||
modalSetContent,
|
modalSetContent,
|
||||||
modalSetTitle,
|
modalSetTitle,
|
||||||
modalSubmit,
|
modalSubmit,
|
||||||
moment,
|
|
||||||
openModal,
|
openModal,
|
||||||
printStockItemLabels,
|
printStockItemLabels,
|
||||||
printTestReports,
|
printTestReports,
|
||||||
@ -1820,6 +1819,9 @@ function loadStockTable(table, options) {
|
|||||||
col = {
|
col = {
|
||||||
field: 'stocktake_date',
|
field: 'stocktake_date',
|
||||||
title: '{% trans "Stocktake" %}',
|
title: '{% trans "Stocktake" %}',
|
||||||
|
formatter: function(value) {
|
||||||
|
return renderDate(value);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!options.params.ordering) {
|
if (!options.params.ordering) {
|
||||||
@ -1833,6 +1835,9 @@ function loadStockTable(table, options) {
|
|||||||
title: '{% trans "Expiry Date" %}',
|
title: '{% trans "Expiry Date" %}',
|
||||||
visible: global_settings.STOCK_ENABLE_EXPIRY,
|
visible: global_settings.STOCK_ENABLE_EXPIRY,
|
||||||
switchable: global_settings.STOCK_ENABLE_EXPIRY,
|
switchable: global_settings.STOCK_ENABLE_EXPIRY,
|
||||||
|
formatter: function(value) {
|
||||||
|
return renderDate(value);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!options.params.ordering) {
|
if (!options.params.ordering) {
|
||||||
@ -1844,6 +1849,9 @@ function loadStockTable(table, options) {
|
|||||||
col = {
|
col = {
|
||||||
field: 'updated',
|
field: 'updated',
|
||||||
title: '{% trans "Last Updated" %}',
|
title: '{% trans "Last Updated" %}',
|
||||||
|
formatter: function(value) {
|
||||||
|
return renderDate(value);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!options.params.ordering) {
|
if (!options.params.ordering) {
|
||||||
@ -2649,14 +2657,7 @@ function loadStockTrackingTable(table, options) {
|
|||||||
title: '{% trans "Date" %}',
|
title: '{% trans "Date" %}',
|
||||||
sortable: true,
|
sortable: true,
|
||||||
formatter: function(value) {
|
formatter: function(value) {
|
||||||
var m = moment(value);
|
return renderDate(value, {showTime: true});
|
||||||
|
|
||||||
if (m.isValid()) {
|
|
||||||
var html = m.format('dddd MMMM Do YYYY'); // + '<br>' + m.format('h:mm a');
|
|
||||||
return html;
|
|
||||||
}
|
|
||||||
|
|
||||||
return '<i>{% trans "Invalid date" %}</i>';
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
InvenTree-Version: {% inventree_version %}
|
InvenTree-Version: {% inventree_version %}
|
||||||
Django Version: {% django_version %}
|
Django Version: {% django_version %}
|
||||||
{% inventree_commit_hash as hash %}{% if hash %}Commit Hash: {{ hash }}{% endif %}
|
{% inventree_commit_hash as hash %}{% if hash %}Commit Hash: {{ hash }}{% endif %}
|
||||||
{% inventree_commit_date as commit_date %}{% if commit_date %}Commit Date: {{ commit_date }}{% endif %}
|
{% inventree_commit_date as commit_date %}{% if commit_date %}Commit Date: {% render_date commit_date %}{% endif %}
|
||||||
Database: {% inventree_db_engine %}
|
Database: {% inventree_db_engine %}
|
||||||
Debug-Mode: {% inventree_in_debug_mode %}
|
Debug-Mode: {% inventree_in_debug_mode %}
|
||||||
Deployed using Docker: {% inventree_docker_mode %}
|
Deployed using Docker: {% inventree_docker_mode %}
|
Loading…
x
Reference in New Issue
Block a user