예제 #1
0
    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))
예제 #2
0
파일: forms.py 프로젝트: NouryG/pychronia
    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"})))
예제 #3
0
    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"})))
예제 #4
0
    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))
예제 #5
0
    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
예제 #6
0
    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