Merge "Redesigns Multiple Select Filter Widget"
[pharos-tools.git] / dashboard / src / booking / forms.py
index 9d71b42..df88cc6 100644 (file)
 ##############################################################################
-# Copyright (c) 2016 Max Breitenfeldt and others.
+# Copyright (c) 2018 Parker Berberian, Sawyer Bergeron, and others.
 #
 # All rights reserved. This program and the accompanying materials
 # are made available under the terms of the Apache License, Version 2.0
 # which accompanies this distribution, and is available at
 # http://www.apache.org/licenses/LICENSE-2.0
 ##############################################################################
-
-
 import django.forms as forms
+from django.forms.widgets import NumberInput
+
+from workflow.forms import (
+    MultipleSelectFilterField,
+    MultipleSelectFilterWidget,
+    FormUtils)
+from account.models import UserProfile
+from resource_inventory.models import Image, Installer, Scenario
+from workflow.forms import SearchableSelectMultipleField
+from booking.lib import get_user_items, get_user_field_opts
 
-from booking.models import Installer, Scenario, Opsys
-from datetime import datetime
 
-class BookingForm(forms.Form):
-    fields = ['start', 'end', 'purpose', 'opsys', 'reset', 'installer', 'scenario']
+class QuickBookingForm(forms.Form):
+    purpose = forms.CharField(max_length=1000)
+    project = forms.CharField(max_length=400)
+    hostname = forms.CharField(max_length=400)
 
-    start = forms.DateTimeField()
-    end = forms.DateTimeField()
-    reset = forms.ChoiceField(choices = ((True, 'Yes'),(False, 'No')), label="Reset System", initial='False', required=False)
-    purpose = forms.CharField(max_length=300)
-    opsys = forms.ModelChoiceField(queryset=Opsys.objects.all(), required=False)
-    opsys.label = "Operating System"
     installer = forms.ModelChoiceField(queryset=Installer.objects.all(), required=False)
     scenario = forms.ModelChoiceField(queryset=Scenario.objects.all(), required=False)
 
-class BookingEditForm(forms.Form):
-    fields = ['start', 'end', 'purpose', 'opsys', 'reset', 'installer', 'scenario']
+    def __init__(self, data=None, user=None, *args, **kwargs):
+        if "default_user" in kwargs:
+            default_user = kwargs.pop("default_user")
+        else:
+            default_user = "you"
+        self.default_user = default_user
 
-    start = forms.DateTimeField()
-    end = forms.DateTimeField()
-    purpose = forms.CharField(max_length=300)
-    opsys = forms.ModelChoiceField(queryset=Opsys.objects.all(), required=False)
-    installer = forms.ModelChoiceField(queryset=Installer.objects.all(), required=False)
-    scenario = forms.ModelChoiceField(queryset=Scenario.objects.all(), required=False)
-    reset = forms.ChoiceField(choices = ((True, 'Yes'),(False, 'No')), label="Reset System", initial='False', required=True)
-
-
-    def __init__(self, *args, **kwargs ):
-        cloned_kwargs = {}
-        cloned_kwargs['purpose'] = kwargs.pop('purpose')
-        cloned_kwargs['start'] = kwargs.pop('start')
-        cloned_kwargs['end'] = kwargs.pop('end')
-        if 'installer' in kwargs:
-            cloned_kwargs['installer'] = kwargs.pop('installer')
-        if 'scenario' in kwargs:
-            cloned_kwargs['scenario'] = kwargs.pop('scenario')
-        super(BookingEditForm, self).__init__( *args, **kwargs)
-
-        self.fields['purpose'].initial = cloned_kwargs['purpose']
-        self.fields['start'].initial = cloned_kwargs['start'].strftime('%m/%d/%Y %H:%M')
-        self.fields['end'].initial = cloned_kwargs['end'].strftime('%m/%d/%Y %H:%M')
-        try:
-            self.fields['installer'].initial = cloned_kwargs['installer'].id
-        except KeyError:
-            pass
-        except AttributeError:
-            pass
+        super(QuickBookingForm, self).__init__(data=data, **kwargs)
+
+        self.fields["image"] = forms.ModelChoiceField(
+            Image.objects.filter(public=True) | Image.objects.filter(owner=user)
+        )
+
+        self.fields['users'] = SearchableSelectMultipleField(
+            queryset=UserProfile.objects.select_related('user').exclude(user=user),
+            items=get_user_items(exclude=user),
+            required=False,
+            **get_user_field_opts()
+        )
+
+        attrs = FormUtils.getLabData(0)
+        self.fields['filter_field'] = MultipleSelectFilterField(widget=MultipleSelectFilterWidget(**attrs))
+        self.fields['length'] = forms.IntegerField(
+            widget=NumberInput(
+                attrs={
+                    "type": "range",
+                    'min': "1",
+                    "max": "21",
+                    "value": "1"
+                }
+            )
+        )
+
+    def build_user_list(self):
+        """
+        returns a mapping of UserProfile ids to displayable objects expected by
+        searchable multiple select widget
+        """
         try:
-            self.fields['scenario'].initial = cloned_kwargs['scenario'].id
-        except KeyError:
-            pass
-        except AttributeError:
+            users = {}
+            d_qset = UserProfile.objects.select_related('user').all().exclude(user__username=self.default_user)
+            for userprofile in d_qset:
+                user = {
+                    'id': userprofile.user.id,
+                    'expanded_name': userprofile.full_name,
+                    'small_name': userprofile.user.username,
+                    'string': userprofile.email_addr
+                }
+
+                users[userprofile.user.id] = user
+
+            return users
+        except Exception:
             pass
+
+    def build_search_widget_attrs(self, chosen_users, default_user="you"):
+
+        attrs = {
+            'set': self.build_user_list(),
+            'show_from_noentry': "false",
+            'show_x_results': 10,
+            'scrollable': "false",
+            'selectable_limit': -1,
+            'name': "users",
+            'placeholder': "username",
+            'initial': chosen_users,
+            'edit': False
+        }
+        return attrs
+
+
+class HostReImageForm(forms.Form):
+
+    image_id = forms.IntegerField()
+    host_id = forms.IntegerField()