forms.py
182 lines
| 6.7 KiB
| text/x-python
|
PythonLexer
|
r2 | from django import forms | ||
|
r6 | from django.utils.safestring import mark_safe | ||
|
r172 | from .models import Device, Experiment, Campaign, Location | ||
from apps.main.models import Configuration | ||||
|
r2 | |||
|
r57 | FILE_FORMAT = ( | ||
('json', 'json'), | ||||
) | ||||
DDS_FILE_FORMAT = ( | ||||
('json', 'json'), | ||||
('text', 'dds') | ||||
) | ||||
RC_FILE_FORMAT = ( | ||||
('json', 'json'), | ||||
|
r79 | ('text', 'racp'), | ||
('binary', 'dat'), | ||||
|
r57 | ) | ||
|
r2 | def add_empty_choice(choices, pos=0, label='-----'): | ||
if len(choices)>0: | ||||
choices = list(choices) | ||||
choices.insert(0, (0, label)) | ||||
return choices | ||||
else: | ||||
return [(0, label)] | ||||
|
r6 | class DatepickerWidget(forms.widgets.TextInput): | ||
def render(self, name, value, attrs=None): | ||||
input_html = super(DatepickerWidget, self).render(name, value, attrs) | ||||
html = '<div class="input-group date">'+input_html+'<span class="input-group-addon"><i class="glyphicon glyphicon-calendar"></i></span></div>' | ||||
return mark_safe(html) | ||||
|
r138 | class DateRangepickerWidget(forms.widgets.TextInput): | ||
def render(self, name, value, attrs=None): | ||||
start = attrs['start_date'] | ||||
|
r172 | end = attrs['end_date'] | ||
|
r138 | html = '''<div class="col-md-5 input-group date" style="float:inherit"> | ||
<input class="form-control" id="id_start_date" name="start_date" placeholder="Start" title="" type="text" value="{}"> | ||||
<span class="input-group-addon"><i class="glyphicon glyphicon-calendar"></i></span> | ||||
</div> | ||||
<div class="col-md-5 col-md-offset-2 input-group date" style="float:inherit"> | ||||
<input class="form-control" id="id_end_date" name="end_date" placeholder="End" title="" type="text" value="{}"> | ||||
<span class="input-group-addon"><i class="glyphicon glyphicon-calendar"></i></span> | ||||
</div>'''.format(start, end) | ||||
return mark_safe(html) | ||||
|
r13 | class TimepickerWidget(forms.widgets.TextInput): | ||
def render(self, name, value, attrs=None): | ||||
input_html = super(TimepickerWidget, self).render(name, value, attrs) | ||||
html = '<div class="input-group time">'+input_html+'<span class="input-group-addon"><i class="glyphicon glyphicon-time"></i></span></div>' | ||||
return mark_safe(html) | ||||
class CampaignForm(forms.ModelForm): | ||||
|
r172 | |||
|
r85 | experiments = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple(), | ||
queryset=Experiment.objects.filter(template=True), | ||||
required=False) | ||||
|
r172 | |||
|
r6 | def __init__(self, *args, **kwargs): | ||
|
r13 | super(CampaignForm, self).__init__(*args, **kwargs) | ||
|
r6 | self.fields['start_date'].widget = DatepickerWidget(self.fields['start_date'].widget.attrs) | ||
self.fields['end_date'].widget = DatepickerWidget(self.fields['end_date'].widget.attrs) | ||||
|
r85 | self.fields['description'].widget.attrs = {'rows': 2} | ||
|
r172 | |||
|
r106 | if self.instance.pk: | ||
|
r91 | self.fields['experiments'].queryset |= self.instance.experiments.all() | ||
|
r172 | |||
|
r13 | class Meta: | ||
model = Campaign | ||||
|
r47 | exclude = [''] | ||
|
r172 | |||
|
r13 | class ExperimentForm(forms.ModelForm): | ||
|
r172 | |||
|
r13 | def __init__(self, *args, **kwargs): | ||
super(ExperimentForm, self).__init__(*args, **kwargs) | ||||
self.fields['start_time'].widget = TimepickerWidget(self.fields['start_time'].widget.attrs) | ||||
self.fields['end_time'].widget = TimepickerWidget(self.fields['end_time'].widget.attrs) | ||||
|
r172 | |||
|
r2 | class Meta: | ||
model = Experiment | ||||
|
r89 | exclude = ['status'] | ||
|
r2 | |||
|
r41 | class LocationForm(forms.ModelForm): | ||
class Meta: | ||||
model = Location | ||||
exclude = [''] | ||||
|
r172 | |||
|
r13 | class DeviceForm(forms.ModelForm): | ||
|
r6 | class Meta: | ||
model = Device | ||||
exclude = ['status'] | ||||
|
r2 | |||
|
r13 | class ConfigurationForm(forms.ModelForm): | ||
|
r172 | |||
|
r85 | def __init__(self, *args, **kwargs): | ||
super(ConfigurationForm, self).__init__(*args, **kwargs) | ||||
|
r172 | |||
|
r85 | if 'initial' in kwargs and 'experiment' in kwargs['initial'] and kwargs['initial']['experiment'] not in (0, '0'): | ||
self.fields['experiment'].widget.attrs['disabled'] = 'disabled' | ||||
|
r172 | |||
|
r13 | class Meta: | ||
model = Configuration | ||||
|
r47 | exclude = ['type', 'created_date', 'programmed_date', 'parameters'] | ||
|
r172 | |||
#class DeviceTypeForm(forms.Form): | ||||
# device_type = forms.ChoiceField(choices=add_empty_choice(DeviceType.objects.all().order_by('name').values_list('id', 'name'))) | ||||
|
r50 | |||
|
r53 | |||
class UploadFileForm(forms.Form): | ||||
|
r172 | |||
|
r53 | file = forms.FileField() | ||
|
r57 | |||
|
r53 | class DownloadFileForm(forms.Form): | ||
|
r172 | |||
|
r57 | format = forms.ChoiceField(choices= ((0, 'json'),) ) | ||
|
r172 | |||
|
r57 | def __init__(self, device_type, *args, **kwargs): | ||
|
r172 | |||
|
r57 | super(DownloadFileForm, self).__init__(*args, **kwargs) | ||
|
r172 | |||
|
r57 | self.fields['format'].choices = FILE_FORMAT | ||
|
r172 | |||
|
r57 | if device_type == 'dds': | ||
self.fields['format'].choices = DDS_FILE_FORMAT | ||||
|
r172 | |||
|
r57 | if device_type == 'rc': | ||
self.fields['format'].choices = RC_FILE_FORMAT | ||||
|
r172 | |||
|
r50 | class OperationForm(forms.Form): | ||
|
r172 | |||
|
r69 | campaign = forms.ChoiceField(label="Campaign") | ||
|
r172 | |||
|
r69 | def __init__(self, *args, **kwargs): | ||
|
r172 | |||
campaigns = kwargs.pop('campaigns') | ||||
|
r69 | super(OperationForm, self).__init__(*args, **kwargs) | ||
|
r172 | self.fields['campaign'].choices=add_empty_choice(campaigns.values_list('id', 'name')) | ||
|
r138 | |||
|
r69 | class OperationSearchForm(forms.Form): | ||
# -----ALL Campaigns------ | ||||
campaign = forms.ChoiceField(label="Campaign") | ||||
|
r172 | |||
|
r69 | def __init__(self, *args, **kwargs): | ||
super(OperationSearchForm, self).__init__(*args, **kwargs) | ||||
self.fields['campaign'].choices=Campaign.objects.all().order_by('-start_date').values_list('id', 'name') | ||||
|
r172 | |||
|
r138 | |||
|
r85 | class NewForm(forms.Form): | ||
|
r172 | |||
|
r85 | create_from = forms.ChoiceField(choices=((0, '-----'), | ||
(1, 'Empty (blank)'), | ||||
(2, 'Template'))) | ||||
choose_template = forms.ChoiceField() | ||||
|
r172 | |||
|
r85 | def __init__(self, *args, **kwargs): | ||
|
r172 | |||
|
r85 | template_choices = kwargs.pop('template_choices', []) | ||
super(NewForm, self).__init__(*args, **kwargs) | ||||
self.fields['choose_template'].choices = add_empty_choice(template_choices) | ||||
|
r172 | |||
|
r138 | |||
class FilterForm(forms.Form): | ||||
|
r172 | |||
|
r138 | def __init__(self, *args, **kwargs): | ||
extra_fields = kwargs.pop('extra_fields', []) | ||||
super(FilterForm, self).__init__(*args, **kwargs) | ||||
|
r172 | |||
for field in extra_fields: | ||||
|
r138 | if 'range_date' in field: | ||
self.fields[field] = forms.CharField(required=False) | ||||
self.fields[field].widget = DateRangepickerWidget() | ||||
if 'initial' in kwargs: | ||||
self.fields[field].widget.attrs = {'start_date':kwargs['initial'].get('start_date', ''), | ||||
|
r172 | 'end_date':kwargs['initial'].get('end_date', '')} | ||
|
r138 | elif 'template' in field: | ||
self.fields['template'] = forms.BooleanField(required=False) | ||||
else: | ||||
self.fields[field] = forms.CharField(required=False) | ||||