def __init__(self, datamanager, *args, **kwargs): super(MoneyTransferForm, self).__init__(datamanager, *args, **kwargs) user = datamanager.user # dynamic fields here ... if user.is_master: _money_all_character_choices = [_get_bank_choice(datamanager)] + \ datamanager.build_select_choices_from_character_usernames( datamanager.get_character_usernames()) self.fields = add_to_ordered_dict( self.fields, 0, "sender_name", forms.ChoiceField(label=_("Sender"), choices=_money_all_character_choices)) self.fields = add_to_ordered_dict( self.fields, 1, "recipient_name", forms.ChoiceField(label=_("Recipient"), choices=_money_all_character_choices)) else: # for standard characters if datamanager.get_character_properties()["account"] <= 0: raise UninstantiableFormError( _("No money available for transfer.")) others = datamanager.get_other_known_characters() others_choices = datamanager.build_select_choices_from_character_usernames( others, add_empty=True) self.fields = add_to_ordered_dict( self.fields, 0, "recipient_name", forms.ChoiceField(label=_("Recipient"), choices=others_choices))
def __init__(self, datamanager, *args, **kwargs): super(GemsTransferForm, self).__init__(datamanager, *args, **kwargs) user = datamanager.user if user.is_master: available_gems = [] for character, properties in datamanager.get_character_sets().items(): available_gems += properties["gems"] else: available_gems = datamanager.get_character_properties()["gems"] # we prepare the choice sets for gems gems_choices = zip(self._encode_gems(available_gems), [self._gem_display(gem) for gem in available_gems]) gems_choices.sort(key=lambda x: x[1]) if not gems_choices: raise UninstantiableFormError("no gems available") # dynamic fields here ... if user.is_master: _character_choices = datamanager.build_select_choices_from_character_usernames(datamanager.get_character_usernames(), add_empty=True) self.fields = add_to_ordered_dict(self.fields, 0, "sender_name", forms.ChoiceField(label=_("Sender"), choices=_character_choices)) self.fields = add_to_ordered_dict(self.fields, 1, "recipient_name", forms.ChoiceField(label=_("Recipient"), choices=_character_choices)) else: others = datamanager.get_other_known_characters() others_choices = datamanager.build_select_choices_from_character_usernames(others, add_empty=True) self.fields = add_to_ordered_dict(self.fields, 1, "recipient_name", forms.ChoiceField(label=_("Recipient"), choices=others_choices)) self.fields = add_to_ordered_dict(self.fields, 2, "gems_choices", forms.MultipleChoiceField(required=False, label=_("Gems"), choices=gems_choices, widget=forms.SelectMultiple(attrs={"class": "multichecklist"})))
def __init__(self, datamanager, *args, **kwargs): super(GemsTransferForm, self).__init__(datamanager, *args, **kwargs) user = datamanager.user if user.is_master: available_gems = datamanager.get_global_parameter( "spent_gems" )[:] # COPY, gems taken so that we can "revive" them for character, properties in list( datamanager.get_character_sets().items()): available_gems += properties["gems"] else: available_gems = datamanager.get_character_properties()["gems"] # we prepare the choice sets for gems gems_choices = list( zip(self._encode_gems(available_gems), [self._gem_display(gem) for gem in available_gems])) gems_choices.sort(key=lambda x: x[1]) if not gems_choices: raise UninstantiableFormError("no gems available") # dynamic fields here ... if user.is_master: _character_choices = datamanager.build_select_choices_from_character_usernames( datamanager.get_character_usernames(), add_empty=True) _character_choices.insert(1, _get_bank_choice( datamanager)) # we add the BANK as sender and recipient! self.fields = add_to_ordered_dict( self.fields, 0, "sender_name", forms.ChoiceField(label=_("Sender"), choices=_character_choices)) self.fields = add_to_ordered_dict( self.fields, 1, "recipient_name", forms.ChoiceField(label=_("Recipient"), choices=_character_choices)) else: others = datamanager.get_other_known_characters( ) # character CANNOT send gems to the Bank here others_choices = datamanager.build_select_choices_from_character_usernames( others, add_empty=True) self.fields = add_to_ordered_dict( self.fields, 1, "recipient_name", forms.ChoiceField(label=_("Recipient"), choices=others_choices)) self.fields = add_to_ordered_dict( self.fields, 2, "gems_choices", forms.MultipleChoiceField(required=False, label=_("Gems"), choices=gems_choices, widget=forms.SelectMultiple( attrs={"class": "multichecklist"})))
def __init__(self, datamanager, *args, **kwargs): super(MoneyTransferForm, self).__init__(datamanager, *args, **kwargs) user = datamanager.user # dynamic fields here ... if user.is_master: _money_all_character_choices = [_get_bank_choice(datamanager)] + \ datamanager.build_select_choices_from_character_usernames(datamanager.get_character_usernames()) self.fields = add_to_ordered_dict(self.fields, 0, "sender_name", forms.ChoiceField(label=_("Sender"), choices=_money_all_character_choices)) self.fields = add_to_ordered_dict(self.fields, 1, "recipient_name", forms.ChoiceField(label=_("Recipient"), choices=_money_all_character_choices)) else: # for standard characters if datamanager.get_character_properties()["account"] <= 0: raise UninstantiableFormError(_("No money available for transfer.")) others = datamanager.get_other_known_characters() others_choices = datamanager.build_select_choices_from_character_usernames(others, add_empty=True) self.fields = add_to_ordered_dict(self.fields, 0, "recipient_name", forms.ChoiceField(label=_("Recipient"), choices=others_choices))
def __init__(self, request, *args, **kwargs): super(MessageComposeForm, self).__init__(request.datamanager, *args, **kwargs) url_data = request.GET # we initialize data with the querydict sender = url_data.get("sender") recipients = url_data.getlist("recipients") or ([url_data["recipient"]] if url_data.get("recipient") else []) assert isinstance(recipients, list) subject = url_data.get("subject") body = url_data.get("body") attachment = url_data.get("attachment") transferred_msg = url_data.get("transferred_msg", "") parent_id = url_data.get("parent_id", "") datamanager = request.datamanager user = request.datamanager.user # TODO - extract these decisions tables to a separate method and test it thoroughly # if user.is_master: # only master has templates ATM use_template = url_data.get("use_template", "") if use_template: # non-empty template fields override parent message fields # try: tpl = datamanager.get_message_template(use_template) except UsageError: user.add_error(_("Message template %s not found") % use_template) else: sender = tpl["sender_email"] or sender recipients = tpl["recipient_emails"] or recipients subject = tpl["subject"] or subject body = tpl["body"] or body attachment = tpl["attachment"] or attachment transferred_msg = tpl["transferred_msg"] or transferred_msg parent_id = tpl["parent_id"] or parent_id self.fields["use_template"] = forms.CharField(required=False, initial=(use_template or None), widget=forms.HiddenInput()) if parent_id: # we transfer data from the parent email, to help user save time # try: tpl = msg = request.datamanager.get_dispatched_message_by_id(parent_id) except UsageError: user.add_error(_("Parent message %s not found") % parent_id) else: visibility_reason = msg["visible_by"].get(user.username, None) subject = msg["subject"] # always retrieved here (but might be prefixed) if visibility_reason == VISIBILITY_REASONS.sender: # we simply recontact recipients (even if we were one of the recipients too) sender = msg["sender_email"] # for master recipients = msg["recipient_emails"] if _("Bis:") not in msg["subject"]: subject = _("Bis:") + " " + subject # don't resend attachment! # elif visibility_reason == VISIBILITY_REASONS.recipient: # we reply to a message sender = msg["recipient_emails"][0] if len(msg["recipient_emails"]) == 1 else None # let the sender empty even for master, if we're not sure which recipient we represent recipients = [msg["sender_email"]] my_email = datamanager.get_character_email() if user.is_character else None recipients += [_email for _email in msg["recipient_emails"] if _email != my_email and _email != sender] # works OK if my_email is None (i.e game master) or sender is None if _("Re:") not in msg["subject"]: subject = _("Re:") + " " + subject # don't resend attachment, here too! # else: # visibility reason is None, or another visibility case (eg. interception) self.logger.warning("Access to forbidden message parent_id %s was attempted", parent_id) user.add_error(_("Access to initial message forbidden.")) parent_id = None if transferred_msg: try: datamanager.get_dispatched_message_by_id(transferred_msg) except UsageError: datamanager.logger.warning("Unknown transferred_msg id %r encountered in url", transferred_msg) transferred_msg = "" # we build dynamic fields from the data we gathered # if user.is_master: sender = Select2TagsField(label=ugettext_lazy("Sender"), required=True, initial=([sender] if sender else [])) # initial MUST be a 1-item list! master_emails = datamanager.global_contacts.keys() + datamanager.get_character_emails(is_npc=True) # PLAYERS EMAILS are not included! sender.choice_tags = datamanager.sort_email_addresses_list(master_emails) assert sender.max_selection_size is not None sender.max_selection_size = 1 self.fields = utilities.add_to_ordered_dict(self.fields, 0, "sender", sender) ''' OBSOLETE CHOCIE FIELD _delay_values_minutes = [unicode(value) for value in [0, 5, 10, 15, 30, 45, 60, 120, 720, 1440]] _delay_values_minutes_labels = [_("%s minutes") % value for value in _delay_values_minutes] _delay_values_minutes_choices = zip(_delay_values_minutes, _delay_values_minutes_labels) self.fields = add_to_ordered_dict(self.fields, 2, "delay_mn", forms.ChoiceField(label=_("Sending delay"), choices=_delay_values_minutes_choices, initial="0")) ''' self.fields = utilities.add_to_ordered_dict(self.fields, 2, "delay_h", forms.FloatField(label=_("Sending delay in hours (eg. 2.4)"), initial=0)) else: pass # no sender or delay_mn fields! available_recipients = datamanager.get_sorted_user_contacts() # current username should not be "anonymous", since it's used only in member areas ! self.fields["recipients"].initial = list(recipients) # prevents ZODB types... self.fields["recipients"].choice_tags = available_recipients self.fields["subject"].initial = subject self.fields["body"].initial = body self.fields["attachment"].initial = [attachment] if attachment else None # BEWARE HERE, a list!! self.fields["attachment"].choice_tags = datamanager.get_personal_files(absolute_urls=False) self.fields["attachment"].max_selection_size = 1 self.fields["parent_id"].initial = parent_id self.fields["transferred_msg"].initial = transferred_msg
def __init__(self, request, *args, **kwargs): super(MessageComposeForm, self).__init__(request.datamanager, *args, **kwargs) url_data = request.GET # we initialize data with the querydict sender = url_data.get("sender") recipients = url_data.getlist("recipients") or ( [url_data["recipient"]] if url_data.get("recipient") else []) assert isinstance(recipients, list) subject = url_data.get("subject") body = url_data.get("body") attachment = url_data.get("attachment") transferred_msg = url_data.get("transferred_msg", "") parent_id = url_data.get("parent_id", "") mask_recipients = (url_data.get("mask_recipients", "") == "1") datamanager = request.datamanager user = request.datamanager.user # TODO - extract these decisions tables to a separate method and test it thoroughly # if user.is_master: # only master has templates ATM template_id = url_data.get("template_id", "") if template_id: # non-empty template fields override query-string and parent-message fields # try: tpl = datamanager.get_message_template(template_id) except UsageError: user.add_error( _("Message template %s not found") % template_id) else: sender = tpl["sender_email"] or sender recipients = tpl["recipient_emails"] or recipients mask_recipients = tpl["mask_recipients"] or mask_recipients subject = tpl["subject"] or subject body = tpl["body"] or body attachment = tpl["attachment"] or attachment transferred_msg = tpl["transferred_msg"] or transferred_msg parent_id = tpl["parent_id"] or parent_id self.fields["template_id"] = forms.CharField( required=False, initial=(template_id or None), widget=forms.HiddenInput()) if parent_id: # we transfer data from the parent email, to help user save time # try: tpl = msg = request.datamanager.get_dispatched_message_by_id( parent_id) except UsageError: user.add_error(_("Parent message %s not found") % parent_id) else: visibility_reason = msg["visible_by"].get(user.username, None) subject = msg[ "subject"] # always retrieved here (but might be prefixed) if visibility_reason == VISIBILITY_REASONS.sender: # we simply recontact recipients (even if we were one of the recipients too) if user.is_master: sender = msg["sender_email"] # for master recipients = msg["recipient_emails"] if _("Bis:") not in msg["subject"]: subject = _("Bis:") + " " + subject # don't resend attachment! # elif visibility_reason == VISIBILITY_REASONS.recipient: # we reply to a message if user.is_master: sender = msg["recipient_emails"][0] if len( msg["recipient_emails"] ) == 1 else None # let the sender empty for master, if we're not sure which recipient we represent recipients = [msg["sender_email"]] my_email = datamanager.get_character_email( ) if user.is_character else None # works OK if my_email is None (i.e game master) or sender is None recipients += [ _email for _email in msg["recipient_emails"] if _email != my_email and _email != sender ] response_prefix = _("Re:") if response_prefix not in msg["subject"]: subject = response_prefix + " " + subject # don't resend attachment, here too! # else: # visibility reason is None, or another visibility case (eg. interception) self.logger.warning( "Access to forbidden message parent_id %s was attempted", parent_id) user.add_error(_("Access to initial message forbidden.")) parent_id = None if transferred_msg: try: datamanager.get_dispatched_message_by_id(transferred_msg) except UsageError: datamanager.logger.warning( "Unknown transferred_msg id %r encountered in url", transferred_msg) transferred_msg = "" # we build dynamic fields from the data we gathered # default_use_restructuredtext = user.is_master # by default, players use raw text self.fields = utilities.add_to_ordered_dict( self.fields, 2, "use_restructuredtext", forms.BooleanField( label=ugettext_lazy("Use markup language (RestructuredText)"), initial=default_use_restructuredtext, required=False)) if user.is_master: sender = Select2TagsField( label=ugettext_lazy("Sender"), required=True, initial=([sender] if sender else [])) # initial MUST be a 1-item list! master_emails = list(datamanager.global_contacts.keys( )) + datamanager.get_character_emails( is_npc=True) # PLAYERS EMAILS are not included! sender.choice_tags = datamanager.sort_email_addresses_list( master_emails) assert sender.max_selection_size is not None sender.max_selection_size = 1 self.fields = utilities.add_to_ordered_dict( self.fields, 0, "sender", sender) ''' OBSOLETE CHOCIE FIELD _delay_values_minutes = [unicode(value) for value in [0, 5, 10, 15, 30, 45, 60, 120, 720, 1440]] _delay_values_minutes_labels = [_("%s minutes") % value for value in _delay_values_minutes] _delay_values_minutes_choices = zip(_delay_values_minutes, _delay_values_minutes_labels) self.fields = add_to_ordered_dict(self.fields, 2, "delay_mn", forms.ChoiceField(label=_("Sending delay"), choices=_delay_values_minutes_choices, initial="0")) ''' self.fields = utilities.add_to_ordered_dict( self.fields, 2, "delay_h", forms.FloatField(label=_("Sending delay in hours (eg. 2.4)"), initial=0)) else: pass # no sender or delay_mn fields! available_recipients = datamanager.get_sorted_user_contacts( ) # current username should not be "anonymous", since it's used only in member areas ! self.fields["recipients"].initial = list( recipients) # prevents ZODB types... self.fields["recipients"].choice_tags = available_recipients self.fields["mask_recipients"].initial = mask_recipients self.fields["subject"].initial = subject self.fields["body"].initial = body self.fields["attachment"].initial = [ attachment ] if attachment else None # BEWARE HERE, a list!! self.fields["attachment"].choice_tags = datamanager.get_personal_files( absolute_urls=False) self.fields["attachment"].max_selection_size = 1 self.fields["parent_id"].initial = parent_id self.fields["transferred_msg"].initial = transferred_msg