Revision 73fbaec4 snf-astakos-app/astakos/im/forms.py
b/snf-astakos-app/astakos/im/forms.py | ||
---|---|---|
38 | 38 |
from django.contrib.auth.forms import ( |
39 | 39 |
UserCreationForm, AuthenticationForm, |
40 | 40 |
PasswordResetForm, PasswordChangeForm, |
41 |
SetPasswordForm |
|
42 |
) |
|
41 |
SetPasswordForm) |
|
43 | 42 |
from django.core.mail import send_mail |
44 | 43 |
from django.contrib.auth.tokens import default_token_generator |
45 | 44 |
from django.template import Context, loader |
... | ... | |
55 | 54 |
from django.contrib.auth.models import AnonymousUser |
56 | 55 |
|
57 | 56 |
from astakos.im.models import ( |
58 |
AstakosUser, EmailChange, AstakosGroup, Invitation, GroupKind, |
|
57 |
AstakosUser, EmailChange, Invitation, |
|
58 |
# AstakosGroup, GroupKind, |
|
59 | 59 |
Resource, PendingThirdPartyUser, get_latest_terms, RESOURCE_SEPARATOR, |
60 |
ProjectDefinition, ProjectApplication |
|
61 |
) |
|
60 |
ProjectApplication) |
|
62 | 61 |
from astakos.im.settings import ( |
63 | 62 |
INVITATIONS_PER_LEVEL, BASEURL, SITENAME, RECAPTCHA_PRIVATE_KEY, |
64 | 63 |
RECAPTCHA_ENABLED, DEFAULT_CONTACT_EMAIL, LOGGING_LEVEL, |
65 | 64 |
PASSWORD_RESET_EMAIL_SUBJECT, NEWPASSWD_INVALIDATE_TOKEN, |
66 |
MODERATION_ENABLED |
|
67 |
) |
|
65 |
MODERATION_ENABLED) |
|
68 | 66 |
from astakos.im.widgets import DummyWidget, RecaptchaWidget |
69 |
from astakos.im.functions import send_change_email |
|
67 |
from astakos.im.functions import send_change_email, submit_application
|
|
70 | 68 |
|
71 | 69 |
from astakos.im.util import reserved_email, get_query |
72 | 70 |
|
... | ... | |
81 | 79 |
|
82 | 80 |
DOMAIN_VALUE_REGEX = re.compile( |
83 | 81 |
r'^(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.){0,126}(?:[A-Z]{2,6}\.?|[A-Z0-9-]{2,}\.?))$', |
84 |
re.IGNORECASE |
|
85 |
) |
|
82 |
re.IGNORECASE) |
|
86 | 83 |
|
87 | 84 |
class StoreUserMixin(object): |
88 | 85 |
@transaction.commit_on_success |
... | ... | |
597 | 594 |
return super(ExtendedPasswordChangeForm, self).save(commit=commit) |
598 | 595 |
|
599 | 596 |
|
600 |
class AstakosGroupCreationForm(forms.ModelForm): |
|
601 |
kind = forms.ModelChoiceField( |
|
602 |
queryset=GroupKind.objects.all(), |
|
603 |
label="", |
|
604 |
widget=forms.HiddenInput() |
|
605 |
) |
|
606 |
name = forms.CharField( |
|
607 |
validators=[validators.RegexValidator( |
|
608 |
DOMAIN_VALUE_REGEX, |
|
609 |
_(astakos_messages.DOMAIN_VALUE_ERR), 'invalid' |
|
610 |
)], |
|
611 |
widget=forms.TextInput(attrs={'placeholder': 'myproject.mylab.ntua.gr'}), |
|
612 |
help_text=" The Project's name should be in a domain format. The domain shouldn't neccessarily exist in the real world but is helpful to imply a structure. e.g.: myproject.mylab.ntua.gr or myservice.myteam.myorganization " |
|
613 |
) |
|
614 |
homepage = forms.URLField( |
|
615 |
label= 'Homepage Url', |
|
616 |
widget=forms.TextInput(attrs={'placeholder': 'http://myproject.com'}), |
|
617 |
help_text="This should be a URL pointing at your project's site. e.g.: http://myproject.com ", |
|
618 |
required=False |
|
619 |
) |
|
620 |
desc = forms.CharField( |
|
621 |
label= 'Description', |
|
622 |
widget=forms.Textarea, |
|
623 |
help_text= "Please provide a short but descriptive abstract of your Project, so that anyone searching can quickly understand what this Project is about. " |
|
624 |
) |
|
625 |
issue_date = forms.DateTimeField( |
|
626 |
label= 'Start date', |
|
627 |
help_text= "Here you specify the date you want your Project to start granting its resources. Its members will get the resources coming from this Project on this exact date." |
|
628 |
) |
|
629 |
expiration_date = forms.DateTimeField( |
|
630 |
label= 'End date', |
|
631 |
help_text= "Here you specify the date you want your Project to cease. This means that after this date all members will no longer be able to allocate resources from this Project. " |
|
632 |
) |
|
633 |
moderation_enabled = forms.BooleanField( |
|
634 |
label= 'Moderated', |
|
635 |
help_text="Select this to approve each member manually, before they become a part of your Project (default). Be sure you know what you are doing, if you uncheck this option. ", |
|
636 |
required=False, |
|
637 |
initial=True |
|
638 |
) |
|
639 |
max_participants = forms.IntegerField( |
|
640 |
label='Total number of members', |
|
641 |
required=True, min_value=1, |
|
642 |
help_text="Here you specify the number of members this Project is going to have. This means that this number of people will be granted the resources you will specify in the next step. This can be '1' if you are the only one wanting to get resources. " |
|
643 |
) |
|
644 |
|
|
645 |
class Meta: |
|
646 |
model = AstakosGroup |
|
647 |
|
|
648 |
def __init__(self, *args, **kwargs): |
|
649 |
#update QueryDict |
|
650 |
args = list(args) |
|
651 |
qd = args.pop(0).copy() |
|
652 |
members_unlimited = qd.pop('members_unlimited', False) |
|
653 |
members_uplimit = qd.pop('members_uplimit', None) |
|
654 |
|
|
655 |
#substitue QueryDict |
|
656 |
args.insert(0, qd) |
|
657 |
|
|
658 |
super(AstakosGroupCreationForm, self).__init__(*args, **kwargs) |
|
659 |
|
|
660 |
self.fields.keyOrder = ['kind', 'name', 'homepage', 'desc', |
|
661 |
'issue_date', 'expiration_date', |
|
662 |
'moderation_enabled', 'max_participants'] |
|
663 |
def add_fields((k, v)): |
|
664 |
k = k.partition('_proxy')[0] |
|
665 |
self.fields[k] = forms.IntegerField( |
|
666 |
required=False, |
|
667 |
widget=forms.HiddenInput(), |
|
668 |
min_value=1 |
|
669 |
) |
|
670 |
map(add_fields, |
|
671 |
((k, v) for k,v in qd.iteritems() if k.endswith('_uplimit')) |
|
672 |
) |
|
673 |
|
|
674 |
def add_fields((k, v)): |
|
675 |
self.fields[k] = forms.BooleanField( |
|
676 |
required=False, |
|
677 |
#widget=forms.HiddenInput() |
|
678 |
) |
|
679 |
map(add_fields, |
|
680 |
((k, v) for k,v in qd.iteritems() if k.startswith('is_selected_')) |
|
681 |
) |
|
682 |
|
|
683 |
def policies(self): |
|
684 |
self.clean() |
|
685 |
policies = [] |
|
686 |
append = policies.append |
|
687 |
for name, uplimit in self.cleaned_data.iteritems(): |
|
688 |
|
|
689 |
subs = name.split('_uplimit') |
|
690 |
if len(subs) == 2: |
|
691 |
prefix, suffix = subs |
|
692 |
s, sep, r = prefix.partition(RESOURCE_SEPARATOR) |
|
693 |
resource = Resource.objects.get(service__name=s, name=r) |
|
694 |
|
|
695 |
# keep only resource limits for selected resource groups |
|
696 |
if self.cleaned_data.get( |
|
697 |
'is_selected_%s' % resource.group, False |
|
698 |
): |
|
699 |
append(dict(service=s, resource=r, uplimit=uplimit)) |
|
700 |
return policies |
|
701 |
|
|
702 |
class AstakosGroupCreationSummaryForm(forms.ModelForm): |
|
703 |
kind = forms.ModelChoiceField( |
|
704 |
queryset=GroupKind.objects.all(), |
|
705 |
label="", |
|
706 |
widget=forms.HiddenInput() |
|
707 |
) |
|
708 |
name = forms.CharField( |
|
709 |
widget=forms.TextInput(attrs={'placeholder': 'eg. foo.ece.ntua.gr'}), |
|
710 |
help_text="Name should be in the form of dns" |
|
711 |
) |
|
712 |
moderation_enabled = forms.BooleanField( |
|
713 |
help_text="Check if you want to approve members participation manually", |
|
714 |
required=False, |
|
715 |
initial=True |
|
716 |
) |
|
717 |
max_participants = forms.IntegerField( |
|
718 |
required=False, min_value=1 |
|
719 |
) |
|
720 |
|
|
721 |
class Meta: |
|
722 |
model = AstakosGroup |
|
723 |
|
|
724 |
def __init__(self, *args, **kwargs): |
|
725 |
#update QueryDict |
|
726 |
args = list(args) |
|
727 |
qd = args.pop(0).copy() |
|
728 |
members_unlimited = qd.pop('members_unlimited', False) |
|
729 |
members_uplimit = qd.pop('members_uplimit', None) |
|
730 |
|
|
731 |
#substitue QueryDict |
|
732 |
args.insert(0, qd) |
|
733 |
|
|
734 |
super(AstakosGroupCreationSummaryForm, self).__init__(*args, **kwargs) |
|
735 |
self.fields.keyOrder = ['kind', 'name', 'homepage', 'desc', |
|
736 |
'issue_date', 'expiration_date', |
|
737 |
'moderation_enabled', 'max_participants'] |
|
738 |
def add_fields((k, v)): |
|
739 |
self.fields[k] = forms.IntegerField( |
|
740 |
required=False, |
|
741 |
widget=forms.TextInput(), |
|
742 |
min_value=1 |
|
743 |
) |
|
744 |
map(add_fields, |
|
745 |
((k, v) for k,v in qd.iteritems() if k.endswith('_uplimit')) |
|
746 |
) |
|
747 |
|
|
748 |
def add_fields((k, v)): |
|
749 |
self.fields[k] = forms.BooleanField( |
|
750 |
required=False, |
|
751 |
widget=forms.HiddenInput() |
|
752 |
) |
|
753 |
map(add_fields, |
|
754 |
((k, v) for k,v in qd.iteritems() if k.startswith('is_selected_')) |
|
755 |
) |
|
756 |
for f in self.fields.values(): |
|
757 |
f.widget = forms.HiddenInput() |
|
758 |
|
|
759 |
def clean(self): |
|
760 |
super(AstakosGroupCreationSummaryForm, self).clean() |
|
761 |
self.cleaned_data['policies'] = [] |
|
762 |
append = self.cleaned_data['policies'].append |
|
763 |
#tbd = [f for f in self.fields if (f.startswith('is_selected_') and (not f.endswith('_proxy')))] |
|
764 |
tbd = [f for f in self.fields if f.startswith('is_selected_')] |
|
765 |
for name, uplimit in self.cleaned_data.iteritems(): |
|
766 |
subs = name.split('_uplimit') |
|
767 |
if len(subs) == 2: |
|
768 |
tbd.append(name) |
|
769 |
prefix, suffix = subs |
|
770 |
s, sep, r = prefix.partition(RESOURCE_SEPARATOR) |
|
771 |
resource = Resource.objects.get(service__name=s, name=r) |
|
772 |
|
|
773 |
# keep only resource limits for selected resource groups |
|
774 |
if self.cleaned_data.get( |
|
775 |
'is_selected_%s' % resource.group, False |
|
776 |
): |
|
777 |
append(dict(service=s, resource=r, uplimit=uplimit)) |
|
778 |
for name in tbd: |
|
779 |
self.cleaned_data.pop(name, None) |
|
780 |
return self.cleaned_data |
|
781 |
|
|
782 |
class AstakosGroupUpdateForm(forms.ModelForm): |
|
783 |
class Meta: |
|
784 |
model = AstakosGroup |
|
785 |
fields = ( 'desc','homepage', 'moderation_enabled') |
|
786 |
|
|
787 |
|
|
788 |
class AddGroupMembersForm(forms.Form): |
|
789 |
q = forms.CharField( |
|
790 |
max_length=800, widget=forms.Textarea, label=_('Add members'), |
|
791 |
help_text=_(astakos_messages.ADD_GROUP_MEMBERS_Q_HELP), |
|
792 |
required=True) |
|
793 |
|
|
794 |
def clean(self): |
|
795 |
q = self.cleaned_data.get('q') or '' |
|
796 |
users = q.split(',') |
|
797 |
users = list(u.strip() for u in users if u) |
|
798 |
db_entries = AstakosUser.objects.filter(email__in=users) |
|
799 |
unknown = list(set(users) - set(u.email for u in db_entries)) |
|
800 |
if unknown: |
|
801 |
raise forms.ValidationError(_(astakos_messages.UNKNOWN_USERS) % ','.join(unknown)) |
|
802 |
self.valid_users = db_entries |
|
803 |
return self.cleaned_data |
|
804 |
|
|
805 |
def get_valid_users(self): |
|
806 |
"""Should be called after form cleaning""" |
|
807 |
try: |
|
808 |
return self.valid_users |
|
809 |
except: |
|
810 |
return () |
|
811 |
|
|
812 |
|
|
813 |
class AstakosGroupSearchForm(forms.Form): |
|
814 |
q = forms.CharField(max_length=200, label='Search project') |
|
815 |
|
|
816 |
|
|
817 |
class TimelineForm(forms.Form): |
|
818 |
entity = forms.ModelChoiceField( |
|
819 |
queryset=AstakosUser.objects.filter(is_active=True) |
|
820 |
) |
|
821 |
resource = forms.ModelChoiceField( |
|
822 |
queryset=Resource.objects.all() |
|
823 |
) |
|
824 |
start_date = forms.DateTimeField() |
|
825 |
end_date = forms.DateTimeField() |
|
826 |
details = forms.BooleanField(required=False, label="Detailed Listing") |
|
827 |
operation = forms.ChoiceField( |
|
828 |
label='Charge Method', |
|
829 |
choices=(('', '-------------'), |
|
830 |
('charge_usage', 'Charge Usage'), |
|
831 |
('charge_traffic', 'Charge Traffic'), ) |
|
832 |
) |
|
833 |
|
|
834 |
def clean(self): |
|
835 |
super(TimelineForm, self).clean() |
|
836 |
d = self.cleaned_data |
|
837 |
if 'resource' in d: |
|
838 |
d['resource'] = str(d['resource']) |
|
839 |
if 'start_date' in d: |
|
840 |
d['start_date'] = d['start_date'].strftime( |
|
841 |
"%Y-%m-%dT%H:%M:%S.%f")[:24] |
|
842 |
if 'end_date' in d: |
|
843 |
d['end_date'] = d['end_date'].strftime("%Y-%m-%dT%H:%M:%S.%f")[:24] |
|
844 |
if 'entity' in d: |
|
845 |
d['entity'] = d['entity'].email |
|
846 |
return d |
|
847 |
|
|
848 |
|
|
849 |
class AstakosGroupSortForm(forms.Form): |
|
850 |
sorting = forms.ChoiceField( |
|
851 |
label='Sort by', |
|
852 |
choices=( |
|
853 |
('groupname', 'Name'), |
|
854 |
('issue_date', 'Issue Date'), |
|
855 |
('expiration_date', 'Expiration Date'), |
|
856 |
('approved_members_num', 'Participants'), |
|
857 |
('moderation_enabled', 'Moderation'), |
|
858 |
('membership_status', 'Enrollment Status') |
|
859 |
), |
|
860 |
required=True |
|
861 |
) |
|
862 |
|
|
863 |
class MembersSortForm(forms.Form): |
|
864 |
sorting = forms.ChoiceField( |
|
865 |
label='Sort by', |
|
866 |
choices=(('person__email', 'User Id'), |
|
867 |
('person__first_name', 'Name'), |
|
868 |
('date_joined', 'Status') |
|
869 |
), |
|
870 |
required=True |
|
871 |
) |
|
872 |
|
|
873 |
class PickResourceForm(forms.Form): |
|
874 |
resource = forms.ModelChoiceField( |
|
875 |
queryset=Resource.objects.select_related().all() |
|
876 |
) |
|
877 |
resource.widget.attrs["onchange"] = "this.form.submit()" |
|
597 |
# class AstakosGroupCreationForm(forms.ModelForm):
|
|
598 |
# kind = forms.ModelChoiceField(
|
|
599 |
# queryset=GroupKind.objects.all(),
|
|
600 |
# label="",
|
|
601 |
# widget=forms.HiddenInput()
|
|
602 |
# )
|
|
603 |
# name = forms.CharField(
|
|
604 |
# validators=[validators.RegexValidator(
|
|
605 |
# DOMAIN_VALUE_REGEX,
|
|
606 |
# _(astakos_messages.DOMAIN_VALUE_ERR), 'invalid'
|
|
607 |
# )],
|
|
608 |
# widget=forms.TextInput(attrs={'placeholder': 'myproject.mylab.ntua.gr'}),
|
|
609 |
# help_text=" The Project's name should be in a domain format. The domain shouldn't neccessarily exist in the real world but is helpful to imply a structure. e.g.: myproject.mylab.ntua.gr or myservice.myteam.myorganization "
|
|
610 |
# )
|
|
611 |
# homepage = forms.URLField(
|
|
612 |
# label= 'Homepage Url',
|
|
613 |
# widget=forms.TextInput(attrs={'placeholder': 'http://myproject.com'}),
|
|
614 |
# help_text="This should be a URL pointing at your project's site. e.g.: http://myproject.com ",
|
|
615 |
# required=False
|
|
616 |
# )
|
|
617 |
# desc = forms.CharField(
|
|
618 |
# label= 'Description',
|
|
619 |
# widget=forms.Textarea,
|
|
620 |
# help_text= "Please provide a short but descriptive abstract of your Project, so that anyone searching can quickly understand what this Project is about. "
|
|
621 |
# )
|
|
622 |
# issue_date = forms.DateTimeField(
|
|
623 |
# label= 'Start date',
|
|
624 |
# help_text= "Here you specify the date you want your Project to start granting its resources. Its members will get the resources coming from this Project on this exact date."
|
|
625 |
# )
|
|
626 |
# expiration_date = forms.DateTimeField(
|
|
627 |
# label= 'End date',
|
|
628 |
# help_text= "Here you specify the date you want your Project to cease. This means that after this date all members will no longer be able to allocate resources from this Project. "
|
|
629 |
# )
|
|
630 |
# moderation_enabled = forms.BooleanField(
|
|
631 |
# label= 'Moderated',
|
|
632 |
# help_text="Select this to approve each member manually, before they become a part of your Project (default). Be sure you know what you are doing, if you uncheck this option. ",
|
|
633 |
# required=False,
|
|
634 |
# initial=True
|
|
635 |
# )
|
|
636 |
# max_participants = forms.IntegerField(
|
|
637 |
# label='Total number of members',
|
|
638 |
# required=True, min_value=1,
|
|
639 |
# help_text="Here you specify the number of members this Project is going to have. This means that this number of people will be granted the resources you will specify in the next step. This can be '1' if you are the only one wanting to get resources. "
|
|
640 |
# )
|
|
641 |
# |
|
642 |
# class Meta:
|
|
643 |
# model = AstakosGroup
|
|
644 |
# |
|
645 |
# def __init__(self, *args, **kwargs):
|
|
646 |
# #update QueryDict
|
|
647 |
# args = list(args)
|
|
648 |
# qd = args.pop(0).copy()
|
|
649 |
# members_unlimited = qd.pop('members_unlimited', False)
|
|
650 |
# members_uplimit = qd.pop('members_uplimit', None)
|
|
651 |
# |
|
652 |
# #substitue QueryDict
|
|
653 |
# args.insert(0, qd)
|
|
654 |
# |
|
655 |
# super(AstakosGroupCreationForm, self).__init__(*args, **kwargs)
|
|
656 |
# |
|
657 |
# self.fields.keyOrder = ['kind', 'name', 'homepage', 'desc',
|
|
658 |
# 'issue_date', 'expiration_date',
|
|
659 |
# 'moderation_enabled', 'max_participants']
|
|
660 |
# def add_fields((k, v)):
|
|
661 |
# k = k.partition('_proxy')[0]
|
|
662 |
# self.fields[k] = forms.IntegerField(
|
|
663 |
# required=False,
|
|
664 |
# widget=forms.HiddenInput(),
|
|
665 |
# min_value=1
|
|
666 |
# )
|
|
667 |
# map(add_fields,
|
|
668 |
# ((k, v) for k,v in qd.iteritems() if k.endswith('_uplimit'))
|
|
669 |
# )
|
|
670 |
# |
|
671 |
# def add_fields((k, v)):
|
|
672 |
# self.fields[k] = forms.BooleanField(
|
|
673 |
# required=False,
|
|
674 |
# #widget=forms.HiddenInput()
|
|
675 |
# )
|
|
676 |
# map(add_fields,
|
|
677 |
# ((k, v) for k,v in qd.iteritems() if k.startswith('is_selected_'))
|
|
678 |
# )
|
|
679 |
# |
|
680 |
# def policies(self):
|
|
681 |
# self.clean()
|
|
682 |
# policies = []
|
|
683 |
# append = policies.append
|
|
684 |
# for name, uplimit in self.cleaned_data.iteritems():
|
|
685 |
# |
|
686 |
# subs = name.split('_uplimit')
|
|
687 |
# if len(subs) == 2:
|
|
688 |
# prefix, suffix = subs
|
|
689 |
# s, sep, r = prefix.partition(RESOURCE_SEPARATOR)
|
|
690 |
# resource = Resource.objects.get(service__name=s, name=r)
|
|
691 |
# |
|
692 |
# # keep only resource limits for selected resource groups
|
|
693 |
# if self.cleaned_data.get(
|
|
694 |
# 'is_selected_%s' % resource.group, False
|
|
695 |
# ):
|
|
696 |
# append(dict(service=s, resource=r, uplimit=uplimit))
|
|
697 |
# return policies
|
|
698 |
# |
|
699 |
# class AstakosGroupCreationSummaryForm(forms.ModelForm):
|
|
700 |
# kind = forms.ModelChoiceField(
|
|
701 |
# queryset=GroupKind.objects.all(),
|
|
702 |
# label="",
|
|
703 |
# widget=forms.HiddenInput()
|
|
704 |
# )
|
|
705 |
# name = forms.CharField(
|
|
706 |
# widget=forms.TextInput(attrs={'placeholder': 'eg. foo.ece.ntua.gr'}),
|
|
707 |
# help_text="Name should be in the form of dns"
|
|
708 |
# )
|
|
709 |
# moderation_enabled = forms.BooleanField(
|
|
710 |
# help_text="Check if you want to approve members participation manually",
|
|
711 |
# required=False,
|
|
712 |
# initial=True
|
|
713 |
# )
|
|
714 |
# max_participants = forms.IntegerField(
|
|
715 |
# required=False, min_value=1
|
|
716 |
# )
|
|
717 |
# |
|
718 |
# class Meta:
|
|
719 |
# model = AstakosGroup
|
|
720 |
# |
|
721 |
# def __init__(self, *args, **kwargs):
|
|
722 |
# #update QueryDict
|
|
723 |
# args = list(args)
|
|
724 |
# qd = args.pop(0).copy()
|
|
725 |
# members_unlimited = qd.pop('members_unlimited', False)
|
|
726 |
# members_uplimit = qd.pop('members_uplimit', None)
|
|
727 |
# |
|
728 |
# #substitue QueryDict
|
|
729 |
# args.insert(0, qd)
|
|
730 |
# |
|
731 |
# super(AstakosGroupCreationSummaryForm, self).__init__(*args, **kwargs)
|
|
732 |
# self.fields.keyOrder = ['kind', 'name', 'homepage', 'desc',
|
|
733 |
# 'issue_date', 'expiration_date',
|
|
734 |
# 'moderation_enabled', 'max_participants']
|
|
735 |
# def add_fields((k, v)):
|
|
736 |
# self.fields[k] = forms.IntegerField(
|
|
737 |
# required=False,
|
|
738 |
# widget=forms.TextInput(),
|
|
739 |
# min_value=1
|
|
740 |
# )
|
|
741 |
# map(add_fields,
|
|
742 |
# ((k, v) for k,v in qd.iteritems() if k.endswith('_uplimit'))
|
|
743 |
# )
|
|
744 |
# |
|
745 |
# def add_fields((k, v)):
|
|
746 |
# self.fields[k] = forms.BooleanField(
|
|
747 |
# required=False,
|
|
748 |
# widget=forms.HiddenInput()
|
|
749 |
# )
|
|
750 |
# map(add_fields,
|
|
751 |
# ((k, v) for k,v in qd.iteritems() if k.startswith('is_selected_'))
|
|
752 |
# )
|
|
753 |
# for f in self.fields.values():
|
|
754 |
# f.widget = forms.HiddenInput()
|
|
755 |
# |
|
756 |
# def clean(self):
|
|
757 |
# super(AstakosGroupCreationSummaryForm, self).clean()
|
|
758 |
# self.cleaned_data['policies'] = []
|
|
759 |
# append = self.cleaned_data['policies'].append
|
|
760 |
# #tbd = [f for f in self.fields if (f.startswith('is_selected_') and (not f.endswith('_proxy')))]
|
|
761 |
# tbd = [f for f in self.fields if f.startswith('is_selected_')]
|
|
762 |
# for name, uplimit in self.cleaned_data.iteritems():
|
|
763 |
# subs = name.split('_uplimit')
|
|
764 |
# if len(subs) == 2:
|
|
765 |
# tbd.append(name)
|
|
766 |
# prefix, suffix = subs
|
|
767 |
# s, sep, r = prefix.partition(RESOURCE_SEPARATOR)
|
|
768 |
# resource = Resource.objects.get(service__name=s, name=r)
|
|
769 |
# |
|
770 |
# # keep only resource limits for selected resource groups
|
|
771 |
# if self.cleaned_data.get(
|
|
772 |
# 'is_selected_%s' % resource.group, False
|
|
773 |
# ):
|
|
774 |
# append(dict(service=s, resource=r, uplimit=uplimit))
|
|
775 |
# for name in tbd:
|
|
776 |
# self.cleaned_data.pop(name, None)
|
|
777 |
# return self.cleaned_data
|
|
778 |
# |
|
779 |
# class AstakosGroupUpdateForm(forms.ModelForm):
|
|
780 |
# class Meta:
|
|
781 |
# model = AstakosGroup
|
|
782 |
# fields = ( 'desc','homepage', 'moderation_enabled')
|
|
783 |
# |
|
784 |
# |
|
785 |
# class AddGroupMembersForm(forms.Form):
|
|
786 |
# q = forms.CharField(
|
|
787 |
# max_length=800, widget=forms.Textarea, label=_('Add members'),
|
|
788 |
# help_text=_(astakos_messages.ADD_GROUP_MEMBERS_Q_HELP),
|
|
789 |
# required=True)
|
|
790 |
# |
|
791 |
# def clean(self):
|
|
792 |
# q = self.cleaned_data.get('q') or ''
|
|
793 |
# users = q.split(',')
|
|
794 |
# users = list(u.strip() for u in users if u)
|
|
795 |
# db_entries = AstakosUser.objects.filter(email__in=users)
|
|
796 |
# unknown = list(set(users) - set(u.email for u in db_entries))
|
|
797 |
# if unknown:
|
|
798 |
# raise forms.ValidationError(_(astakos_messages.UNKNOWN_USERS) % ','.join(unknown))
|
|
799 |
# self.valid_users = db_entries
|
|
800 |
# return self.cleaned_data
|
|
801 |
# |
|
802 |
# def get_valid_users(self):
|
|
803 |
# """Should be called after form cleaning"""
|
|
804 |
# try:
|
|
805 |
# return self.valid_users
|
|
806 |
# except:
|
|
807 |
# return ()
|
|
808 |
# |
|
809 |
# |
|
810 |
# class AstakosGroupSearchForm(forms.Form):
|
|
811 |
# q = forms.CharField(max_length=200, label='Search project')
|
|
812 |
# |
|
813 |
# |
|
814 |
# class TimelineForm(forms.Form):
|
|
815 |
# entity = forms.ModelChoiceField(
|
|
816 |
# queryset=AstakosUser.objects.filter(is_active=True)
|
|
817 |
# )
|
|
818 |
# resource = forms.ModelChoiceField(
|
|
819 |
# queryset=Resource.objects.all()
|
|
820 |
# )
|
|
821 |
# start_date = forms.DateTimeField()
|
|
822 |
# end_date = forms.DateTimeField()
|
|
823 |
# details = forms.BooleanField(required=False, label="Detailed Listing")
|
|
824 |
# operation = forms.ChoiceField(
|
|
825 |
# label='Charge Method',
|
|
826 |
# choices=(('', '-------------'),
|
|
827 |
# ('charge_usage', 'Charge Usage'),
|
|
828 |
# ('charge_traffic', 'Charge Traffic'), )
|
|
829 |
# )
|
|
830 |
# |
|
831 |
# def clean(self):
|
|
832 |
# super(TimelineForm, self).clean()
|
|
833 |
# d = self.cleaned_data
|
|
834 |
# if 'resource' in d:
|
|
835 |
# d['resource'] = str(d['resource'])
|
|
836 |
# if 'start_date' in d:
|
|
837 |
# d['start_date'] = d['start_date'].strftime(
|
|
838 |
# "%Y-%m-%dT%H:%M:%S.%f")[:24]
|
|
839 |
# if 'end_date' in d:
|
|
840 |
# d['end_date'] = d['end_date'].strftime("%Y-%m-%dT%H:%M:%S.%f")[:24]
|
|
841 |
# if 'entity' in d:
|
|
842 |
# d['entity'] = d['entity'].email
|
|
843 |
# return d
|
|
844 |
# |
|
845 |
# |
|
846 |
# class AstakosGroupSortForm(forms.Form):
|
|
847 |
# sorting = forms.ChoiceField(
|
|
848 |
# label='Sort by',
|
|
849 |
# choices=(
|
|
850 |
# ('groupname', 'Name'),
|
|
851 |
# ('issue_date', 'Issue Date'),
|
|
852 |
# ('expiration_date', 'Expiration Date'),
|
|
853 |
# ('approved_members_num', 'Participants'),
|
|
854 |
# ('moderation_enabled', 'Moderation'),
|
|
855 |
# ('membership_status', 'Enrollment Status')
|
|
856 |
# ),
|
|
857 |
# required=True
|
|
858 |
# )
|
|
859 |
# |
|
860 |
# class MembersSortForm(forms.Form):
|
|
861 |
# sorting = forms.ChoiceField(
|
|
862 |
# label='Sort by',
|
|
863 |
# choices=(('person__email', 'User Id'),
|
|
864 |
# ('person__first_name', 'Name'),
|
|
865 |
# ('date_joined', 'Status')
|
|
866 |
# ),
|
|
867 |
# required=True
|
|
868 |
# )
|
|
869 |
# |
|
870 |
# class PickResourceForm(forms.Form):
|
|
871 |
# resource = forms.ModelChoiceField(
|
|
872 |
# queryset=Resource.objects.select_related().all()
|
|
873 |
# )
|
|
874 |
# resource.widget.attrs["onchange"] = "this.form.submit()"
|
|
878 | 875 |
|
879 | 876 |
|
880 | 877 |
class ExtendedSetPasswordForm(SetPasswordForm): |
... | ... | |
921 | 918 |
comments = forms.CharField(widget=forms.Textarea, required=False) |
922 | 919 |
|
923 | 920 |
class Meta: |
924 |
model = ProjectDefinition |
|
925 |
exclude = ('resource_grants', 'id') |
|
926 |
|
|
927 |
|
|
928 |
def __init__(self, *args, **kwargs): |
|
929 |
super(ProjectApplicationForm, self).__init__(*args, **kwargs) |
|
930 |
instance = kwargs.get('instance') |
|
931 |
if instance: |
|
932 |
self.initial['comments'] = instance.projectapplication.comments |
|
933 |
|
|
921 |
model = ProjectApplication |
|
922 |
exclude = ( |
|
923 |
'resource_grants', 'id', 'applicant', 'owner', |
|
924 |
'precursor_application', 'state', 'issue_date') |
|
925 |
|
|
934 | 926 |
def clean(self): |
935 | 927 |
userid = self.data.get('user', None) |
936 | 928 |
self.user = None |
... | ... | |
967 | 959 |
return policies |
968 | 960 |
|
969 | 961 |
def save(self, commit=True): |
970 |
definition = super(ProjectApplicationForm, self).save(commit=False)
|
|
962 |
application = super(ProjectApplicationForm, self).save(commit=False)
|
|
971 | 963 |
applicant = self.user |
972 | 964 |
comments = self.cleaned_data.pop('comments', None) |
973 | 965 |
try: |
974 |
precursor_application = self.instance.projectapplication
|
|
966 |
precursor_application = self.instance.precursor_application
|
|
975 | 967 |
except: |
976 | 968 |
precursor_application = None |
977 |
return ProjectApplication.submit(
|
|
978 |
definition,
|
|
969 |
return submit_application(
|
|
970 |
application,
|
|
979 | 971 |
self.resource_policies, |
980 | 972 |
applicant, |
981 | 973 |
comments, |
... | ... | |
985 | 977 |
class ProjectSortForm(forms.Form): |
986 | 978 |
sorting = forms.ChoiceField( |
987 | 979 |
label='Sort by', |
988 |
choices=(('definition__name', 'Sort by Name'),
|
|
980 |
choices=(('name', 'Sort by Name'), |
|
989 | 981 |
('issue_date', 'Sort by Issue date'), |
990 |
('definition__start_date', 'Sort by Start Date'),
|
|
991 |
('definition__end_date', 'Sort by End Date'),
|
|
982 |
('start_date', 'Sort by Start Date'), |
|
983 |
('end_date', 'Sort by End Date'), |
|
992 | 984 |
# ('approved_members_num', 'Sort by Participants'), |
993 | 985 |
('state', 'Sort by Status'), |
994 |
('definition__member_join_policy__description', 'Sort by Member Join Policy'),
|
|
995 |
('definition__member_leave_policy__description', 'Sort by Member Leave Policy')
|
|
986 |
('member_join_policy__description', 'Sort by Member Join Policy'), |
|
987 |
('member_leave_policy__description', 'Sort by Member Leave Policy') |
|
996 | 988 |
), |
997 | 989 |
required=True |
998 | 990 |
) |
Also available in: Unified diff