Initial
This commit is contained in:
0
app/base/forms/__init__.py
Executable file
0
app/base/forms/__init__.py
Executable file
40
app/base/forms/fields.py
Normal file
40
app/base/forms/fields.py
Normal file
@@ -0,0 +1,40 @@
|
||||
from django.db import models
|
||||
from django import forms
|
||||
|
||||
from app.base.forms.widgets.date_widget import DateWithNow
|
||||
from app.base.forms.widgets.datetime_widget import DateTimeWithNow
|
||||
|
||||
from decimal import Decimal
|
||||
|
||||
|
||||
class AutosizeTextarea(forms.Textarea):
|
||||
template_name = 'forms/widgets/textarea.html'
|
||||
|
||||
|
||||
class TextField(models.TextField):
|
||||
def formfield(self, **kwargs):
|
||||
if 'widget' not in kwargs: # only if no other is set (admin UI)
|
||||
kwargs['widget'] = AutosizeTextarea
|
||||
return super().formfield(**kwargs)
|
||||
|
||||
|
||||
class DateTimeField(models.DateTimeField):
|
||||
def formfield(self, **kwargs):
|
||||
if 'widget' not in kwargs: # only if no other is set (admin UI)
|
||||
kwargs['widget'] = DateTimeWithNow
|
||||
return super().formfield(**kwargs)
|
||||
|
||||
|
||||
class DateField(models.DateField):
|
||||
def formfield(self, **kwargs):
|
||||
if 'widget' not in kwargs: # only if no other is set (admin UI)
|
||||
kwargs['widget'] = DateWithNow
|
||||
return super().formfield(**kwargs)
|
||||
|
||||
|
||||
class CurrencyField(models.DecimalField):
|
||||
def __init__(self, *args, **kwargs) -> None:
|
||||
kwargs['decimal_places'] = kwargs.get('decimal_places', 2)
|
||||
kwargs['max_digits'] = kwargs.get('max_digits', 10)
|
||||
kwargs['default'] = kwargs.get('default', Decimal(0))
|
||||
super().__init__(*args, **kwargs)
|
||||
0
app/base/forms/widgets/__init__.py
Executable file
0
app/base/forms/widgets/__init__.py
Executable file
14
app/base/forms/widgets/date_widget.py
Executable file
14
app/base/forms/widgets/date_widget.py
Executable file
@@ -0,0 +1,14 @@
|
||||
from django import forms
|
||||
|
||||
|
||||
class DateWithNow(forms.DateInput):
|
||||
template_name = 'forms/widgets/date.html'
|
||||
|
||||
def __init__(self, attrs=None, format=None):
|
||||
rv = attrs or {}
|
||||
rv['type'] = 'date'
|
||||
super().__init__(rv, format='%Y-%m-%d')
|
||||
|
||||
# OR: prevent super from converting dateformat.date to str
|
||||
# def format_value(self, value: date) -> date:
|
||||
# return value
|
||||
22
app/base/forms/widgets/datetime_widget.py
Executable file
22
app/base/forms/widgets/datetime_widget.py
Executable file
@@ -0,0 +1,22 @@
|
||||
from django import forms
|
||||
from django.forms.utils import to_current_timezone
|
||||
from django.http.request import QueryDict
|
||||
|
||||
from datetime import datetime
|
||||
|
||||
|
||||
class DateTimeWithNow(forms.DateTimeInput):
|
||||
template_name = 'forms/widgets/datetime.html'
|
||||
|
||||
def format_value(self, value: datetime) -> datetime:
|
||||
return to_current_timezone(value)
|
||||
|
||||
def value_from_datadict(self, data: QueryDict, files, name: str) \
|
||||
-> 'datetime|None':
|
||||
day, time = data.getlist(name)
|
||||
if not day:
|
||||
return None
|
||||
y, m, d = day.split('-')
|
||||
h, i, *s = time.split(':') if time else (0, 0, 0)
|
||||
return datetime(
|
||||
int(y), int(m), int(d), int(h), int(i), int(s[0] if s else 0))
|
||||
Reference in New Issue
Block a user