コード例 #1
0
    def __init__(self, data=None, **kwargs):
        if 'request' in kwargs:
            request = kwargs.pop('request')
        if data:
            forms.Form.__init__(self, data, **kwargs)
        else:
            forms.Form.__init__(self, **kwargs)

        #Question forms
        i = 0
        for lang, lang_verbose in languages:
            form_name = 'question_%s' % lang
            form_label = 'Question:%s' % lang_verbose
            if i == 0:
                self.fields[form_name] = forms.CharField(label=form_label,
                                                         max_length=160,
                                                         required=True,
                                                         widget=SMSInput())
            else:
                self.fields[form_name] = forms.CharField(label=form_label,
                                                         max_length=160,
                                                         required=False,
                                                         widget=SMSInput())
            i += 1
        #Response forms
        for lang, lang_verbose in languages:
            form_name = 'default_response_%s' % lang
            form_label = 'Default Response:%s' % lang_verbose
            self.fields[form_name] = forms.CharField(label=form_label,
                                                     max_length=160,
                                                     required=False,
                                                     widget=SMSInput())

        # This may seem like a hack, but this allows time for the Contact model
        # to optionally have groups (i.e., poll doesn't explicitly depend on the rapidsms-auth
        # app.
        queryset = Group.objects.order_by('name')
        if 'request' in kwargs:
            request = kwargs.pop('request')
        try:
            access = Access.objects.get(user=request.user)
            queryset = access.groups.order_by('name')
        except Access.DoesNotExist:
            pass
        except UnboundLocalError:
            pass
        if hasattr(Contact, 'groups'):
            GROUP_CHOICES = [(-1, _('Without Group'))]
            GROUP_CHOICES += [
                (id, name) for id, name in queryset.values_list('id', 'name')
            ]
            #             self.fields['groups'] = forms.ModelMultipleChoiceField(queryset=queryset, required=False)
            self.fields['groups'] = forms.MultipleChoiceField(
                choices=GROUP_CHOICES, required=False)
コード例 #2
0
class AssignToNewPollForm(ActionForm):
    """ assigns contacts to poll"""

    action_label = _('Assign to New poll')
    poll_name = forms.CharField(label=_('Poll Name'), max_length='100')
    POLL_TYPES = [('yn', _('Yes/No Question'))] + [
        (c['type'], c['label']) for c in Poll.TYPE_CHOICES.values()
    ]
    response_type = \
        forms.ChoiceField(choices=Poll.RESPONSE_TYPE_CHOICES,
                          widget=RadioSelect, label=_("Response type"))
    poll_type = forms.ChoiceField(choices=POLL_TYPES, label=_("Poll type"))
    question = forms.CharField(max_length=160,
                               required=True,
                               widget=SMSInput(),
                               label=_("Question"))
    default_response = forms.CharField(max_length=160,
                                       required=False,
                                       widget=SMSInput(),
                                       label=_("Default response"))

    def perform(self, request, results):
        if not len(results):
            return (_('No contacts selected'), 'error')
        name = self.cleaned_data['poll_name']
        poll_type = self.cleaned_data['poll_type']
        poll_type = self.cleaned_data['poll_type']
        if poll_type == NewPollForm.TYPE_YES_NO:
            poll_type = Poll.TYPE_TEXT

        question = self.cleaned_data.get('question').replace('%', u'\u0025')
        default_response = self.cleaned_data['default_response']
        response_type = self.cleaned_data['response_type']
        contacts = Contact.objects.filter(pk__in=results)
        poll = Poll.create_with_bulk(name=name,
                                     type=poll_type,
                                     question=question,
                                     default_response=default_response,
                                     contacts=contacts,
                                     user=request.user)

        poll.response_type = response_type
        if self.cleaned_data['poll_type'] == NewPollForm.TYPE_YES_NO:
            poll.add_yesno_categories()
        poll.save()

        if settings.SITE_ID:
            poll.sites.add(Site.objects.get_current())

        return (_('%(results)d participants added to  %(poll)s poll') % {
            "results": len(results),
            "poll": poll.name
        }, 'success')
コード例 #3
0
class MassTextForm(ActionForm):
    text = forms.CharField(max_length=160,
                           required=True,
                           widget=SMSInput(),
                           label=_("text"))
    text_luo = forms.CharField(max_length=160,
                               required=False,
                               widget=SMSInput(),
                               label=_("text luo"))

    action_label = 'Send Message'

    def perform(self, request, results):
        if results is None or len(results) == 0:
            return (_('A message must have one or more recipients!'), 'error')

        if request.user and request.user.has_perm('contact.can_message'):
            blacklists = Blacklist.objects.values_list('connection')
            connections = \
                Connection.objects.filter(contact__in=results).exclude(pk__in=blacklists).distinct()

            text = self.cleaned_data.get('text', "")
            text = text.replace('%', u'\u0025')

            if not self.cleaned_data['text_luo'] == '':
                (translation, created) = \
                    Translation.objects.get_or_create(language='ach',
                                                      field=self.cleaned_data['text'],
                                                      value=self.cleaned_data['text_luo'])

            messages = Message.mass_text(text, connections)
            contacts = Contact.objects.filter(pk__in=results)

            MassText.bulk.bulk_insert(send_pre_save=False,
                                      user=request.user,
                                      text=text,
                                      contacts=list(contacts))
            masstexts = MassText.bulk.bulk_insert_commit(send_post_save=False,
                                                         autoclobber=True)
            masstext = masstexts[0]

            return (
                _('Message successfully sent to %(connections)d numbers') % {
                    "connections": len(connections)
                },
                'success',
            )
        else:
            return (
                _("You don't have permission to send messages!"),
                'error',
            )
コード例 #4
0
class ReplyTextForm(ActionForm):
    text = forms.CharField(required=True, widget=SMSInput())
    action_label = 'Reply to selected'

    def perform(self, request, results):
        if results is None or len(results) == 0:
            return ('A message must have one or more recipients!', 'error')

        if request.user and request.user.has_perm('contact.can_message'):
            text = self.cleaned_data['text']
            if isinstance(results[0], Message):
                connections = results.values_list('connection', flat=True)
            elif isinstance(results[0], Response):
                connections = results.values_list('message__connection',
                                                  flat=True)

            Message.mass_text(
                text,
                Connection.objects.filter(pk__in=connections).distinct(),
                status='P')

            return ('%d messages sent successfully' % results.count(),
                    'success')
        else:
            return ("You don't have permission to send messages!", 'error')
コード例 #5
0
ファイル: forms.py プロジェクト: revence27/rapidsms-contact
class ReplyTextForm(ActionForm):

    text = forms.CharField(required=True, widget=SMSInput())
    action_label = 'Reply to selected'

    def perform(self, request, results):
        if results is None or len(results) == 0:
            return ('A message must have one or more recipients!', 'error')

        if request.user and request.user.has_perm('contact.can_message'):
            router = get_router()
            text = self.cleaned_data['text']
            start_sending_mass_messages()
            for msg in results:
                outgoing = OutgoingMessage(msg.connection, text)
                router.handle_outgoing(outgoing, msg)
            stop_sending_mass_messages()
            return (
                '%d messages sent successfully' % results.count(),
                'success',
            )
        else:
            return (
                "You don't have permission to send messages!",
                'error',
            )
コード例 #6
0
ファイル: forms.py プロジェクト: revence27/rapidsms-contact
class MassTextForm(ActionForm):

    text = forms.CharField(max_length=160, required=True, widget=SMSInput())
    action_label = 'Send Message'

    def clean_text(self):
        text = self.cleaned_data['text']

        #replace common MS-word characters with SMS-friendly characters
        for find, replace in [(u'\u201c', '"'), (u'\u201d', '"'),
                              (u'\u201f', '"'), (u'\u2018', "'"),
                              (u'\u2019', "'"), (u'\u201B', "'"),
                              (u'\u2013', "-"), (u'\u2014', "-"),
                              (u'\u2015', "-"), (u'\xa7', "$"), (u'\xa1', "i"),
                              (u'\xa4', ''), (u'\xc4', 'A')]:
            text = text.replace(find, replace)
        return text

    def perform(self, request, results):
        if results is None or len(results) == 0:
            return ('A message must have one or more recipients!', 'error')

        if request.user and request.user.has_perm('contact.can_message'):
            if type(results[0]).__name__ == 'Reporters':

                con_ids = \
                [r.default_connection.split(',')[1] if len(r.default_connection.split(',')) > 1 else 0 for r in results]
                connections = list(
                    Connection.objects.filter(pk__in=con_ids).distinct())
                contacts = list(
                    Contact.objects.filter(
                        pk__in=results.values_list('id', flat=True)))
            else:
                connections = \
                list(Connection.objects.filter(contact__pk__in=results.values_list('id', flat=True)).distinct())
                contacts = list(results)
            text = self.cleaned_data.get('text', "")
            text = text.replace('%', u'\u0025')
            messages = Message.mass_text(text, connections)

            MassText.bulk.bulk_insert(send_pre_save=False,
                                      user=request.user,
                                      text=text,
                                      contacts=contacts)
            masstexts = MassText.bulk.bulk_insert_commit(send_post_save=False,
                                                         autoclobber=True)
            masstext = masstexts[0]
            if settings.SITE_ID:
                masstext.sites.add(Site.objects.get_current())

            return (
                'Message successfully sent to %d numbers' % len(connections),
                'success',
            )
        else:
            return (
                "You don't have permission to send messages!",
                'error',
            )
コード例 #7
0
ファイル: forms.py プロジェクト: unicefuganda/rapidsms-edtrac
class SchoolMassTextForm(ActionForm):

    text = forms.CharField(max_length=160, required=True, widget=SMSInput())
    action_label = 'Send Message'

    def clean_text(self):
        text = self.cleaned_data['text']

        #replace common MS-word characters with SMS-friendly characters
        for find, replace in [(u'\u201c', '"'), (u'\u201d', '"'),
                              (u'\u201f', '"'), (u'\u2018', "'"),
                              (u'\u2019', "'"), (u'\u201B', "'"),
                              (u'\u2013', "-"), (u'\u2014', "-"),
                              (u'\u2015', "-"), (u'\xa7', "$"), (u'\xa1', "i"),
                              (u'\xa4', ''), (u'\xc4', 'A')]:
            text = text.replace(find, replace)
        return text

    def perform(self, request, results):
        if results is None or len(results) == 0:
            return ('A message must have one or more recipients!', 'error')

        if request.user and request.user.has_perm('auth.add_message'):
            reporters = []
            for school in results:
                for rep in school.emisreporter_set.filter(
                        groups__name__in=['Teachers', 'Head Teachers']):
                    reporters.append(rep)
            connections = \
                list(Connection.objects.filter(contact__in=reporters).distinct())

            text = self.cleaned_data.get('text', "")
            text = text.replace('%', u'\u0025')

            messages = Message.mass_text(text, connections)

            MassText.bulk.bulk_insert(send_pre_save=False,
                                      user=request.user,
                                      text=text,
                                      contacts=list(reporters))
            masstexts = MassText.bulk.bulk_insert_commit(send_post_save=False,
                                                         autoclobber=True)
            masstext = masstexts[0]
            if settings.SITE_ID:
                masstext.sites.add(Site.objects.get_current())

            return (
                'Message successfully sent to %d numbers' % len(connections),
                'success',
            )
        else:
            return (
                "You don't have permission to send messages!",
                'error',
            )
コード例 #8
0
ファイル: forms.py プロジェクト: mbanje/ureport-project
class TemplateMessage(ActionForm):
    template = forms.CharField(max_length=160, required=True, widget=SMSInput(),
                               help_text="message shd be of form Dear Hon. [insert name]. [insert results ] of people from [insert district] say that lorem ipsum")
    poll = forms.ModelChoiceField(
        queryset=Poll.objects.exclude(start_date=None).exclude(categories=None).order_by('-pk'))

    label = "Send Message"


    def perform(self, request, results):

        if request.user:
            poll = self.cleaned_data['poll']
            contacts = Contact.objects.filter(pk__in=results).exclude(connection=None)
            regex = re.compile(r"(\[[^\[\]]+\])")
            template = self.cleaned_data['template']
            parts = regex.split(template)
            yesno_category_names = ['yes', 'no']
            poll_data = get_poll_data(poll)
            if poll_data:
                import datetime

                key = "templatemsg%s" % str(datetime.datetime.now().isoformat())
                temp_msg, _ = MessageAttribute.objects.get_or_create(name=key)

                for contact in contacts:

                    if contact.reporting_location and poll_data.get(contact.reporting_location.pk, None):
                        d = {
                            'name': contact.name.split()[-1],
                            'district': contact.reporting_location.name,
                            'results': get_summary(contact.reporting_location.pk, poll_data)

                        }

                        message = ""
                        for p in parts:
                            if p.strip().startswith("["):

                                message = message + d[p.replace("[", "").replace("]", "").strip().rsplit()[1]]
                            else:
                                message = message + p

                        message = Message.objects.create(status="P", direction="O",
                                                         connection=contact.default_connection, text=message)
                        msg_a = MessageDetail.objects.create(message=message, attribute=temp_msg, value='comfirm')

                return (mark_safe(
                    'Message is going to be sent to   %d contacts .<a href="/comfirmmessages/%s/">Comfirm Sending </a>' % (
                        len(results), key)), 'success',)
            else:
                return ("some thing went wrong", 'error',)

        else:
            return ("you need to be logged in ", 'error',)
コード例 #9
0
 def __init__(self, data=None, **kwargs):
     self.request = kwargs.pop('request')
     if data:
         forms.Form.__init__(self, data, **kwargs)
     else:
         forms.Form.__init__(self, **kwargs)
     i = 0
     for lang, lang_verbose in languages:
         form_name = 'question_%s' % lang
         if i == 0:
             self.fields[form_name] = forms.CharField(label=lang_verbose,
                                                      max_length=160,
                                                      required=True,
                                                      widget=SMSInput())
         else:
             self.fields[form_name] = forms.CharField(label=lang_verbose,
                                                      max_length=160,
                                                      required=False,
                                                      widget=SMSInput())
         i += 1
コード例 #10
0
class ForwardMessageForm(forms.Form):
    recipients = forms.CharField(label="recepient(s)",
                                 required=True,
                                 help_text="enter numbers commas separated")
    text = forms.CharField(required=True, widget=SMSInput())
コード例 #11
0
class AssignToNewPollForm(ActionForm):
    """ assigns contacts to poll"""

    action_label = 'Assign to New poll'
    poll_name = forms.CharField(label='Poll Name', max_length='100')
    POLL_TYPES = [('yn', 'Yes/No Question')] + [
        (c['type'], c['label']) for c in Poll.TYPE_CHOICES.values()
    ]
    response_type = forms.ChoiceField(choices=Poll.RESPONSE_TYPE_CHOICES,
                                      widget=RadioSelect)
    poll_type = forms.ChoiceField(choices=POLL_TYPES)

    def __init__(self, data=None, **kwargs):
        self.request = kwargs.pop('request')
        if data:
            forms.Form.__init__(self, data, **kwargs)
        else:
            forms.Form.__init__(self, **kwargs)
        i = 0
        for lang, lang_verbose in languages:
            form_name = 'question_%s' % lang
            if i == 0:
                self.fields[form_name] = forms.CharField(label=lang_verbose,
                                                         max_length=160,
                                                         required=True,
                                                         widget=SMSInput())
            else:
                self.fields[form_name] = forms.CharField(label=lang_verbose,
                                                         max_length=160,
                                                         required=False,
                                                         widget=SMSInput())
            i += 1

    default_response = forms.CharField(max_length=160,
                                       required=False,
                                       widget=SMSInput())

    def perform(self, request, results):
        #TODO: Deal with languages
        languages = ["fr"]
        question_fr = self.cleaned_data.get('question_fr', "")
        question_fr = question_fr.replace('%', u'\u0025')

        if not self.cleaned_data['question_en'] == '':
            languages.append('en')
            (translation, created) = \
                Translation.objects.get_or_create(language='en',
                    field=self.cleaned_data['question_fr'],
                    value=self.cleaned_data['question_en'])

        if not self.cleaned_data['question_ki'] == '':
            languages.append('ki')
            (translation, created) = \
                Translation.objects.get_or_create(language='ki',
                    field=self.cleaned_data['question_fr'],
                    value=self.cleaned_data['question_ki'])

        if not len(results):
            return ('No contacts selected', 'error')
        name = self.cleaned_data['poll_name']
        poll_type = self.cleaned_data['poll_type']
        poll_type = self.cleaned_data['poll_type']
        if poll_type == NewPollForm.TYPE_YES_NO:
            poll_type = Poll.TYPE_TEXT


#        question = self.cleaned_data.get('question').replace('%', u'\u0025')
        default_response = self.cleaned_data['default_response']
        response_type = self.cleaned_data['response_type']
        contacts = Contact.objects.filter(pk__in=results)
        poll = Poll.create_with_bulk(name=name,
                                     type=poll_type,
                                     question=question_fr,
                                     default_response=default_response,
                                     contacts=contacts,
                                     user=request.user)

        poll.response_type = response_type
        if self.cleaned_data['poll_type'] == NewPollForm.TYPE_YES_NO:
            poll.add_yesno_categories()
        poll.save()

        if settings.SITE_ID:
            poll.sites.add(Site.objects.get_current())

        return ('%d participants added to  %s poll' %
                (len(results), poll.name), 'success')
コード例 #12
0
class NewPollForm(forms.Form):  # pragma: no cover

    TYPE_YES_NO = 'yn'

    type = forms.ChoiceField(required=True,
                             label=_("Type"),
                             choices=((TYPE_YES_NO, _('Yes/No Question')), ))
    response_type = forms.ChoiceField(choices=Poll.RESPONSE_TYPE_CHOICES,
                                      widget=RadioSelect,
                                      initial=Poll.RESPONSE_TYPE_ALL,
                                      label=_("Response type"))

    is_urgent = forms.BooleanField(required=False, label=_('Is urgent'))

    def updateTypes(self):
        self.fields['type'].widget.choices += [
            (choice['type'], choice['label'])
            for choice in Poll.TYPE_CHOICES.values()
        ]

    name = forms.CharField(max_length=32, required=True, label=_('Name'))
    question_en = forms.CharField(max_length=160,
                                  required=True,
                                  widget=SMSInput(),
                                  label=_('Question en'))
    question_luo = forms.CharField(max_length=160,
                                   required=False,
                                   widget=SMSInput(),
                                   label=_('Question luo'))
    question_kdj = forms.CharField(max_length=160,
                                   required=False,
                                   widget=SMSInput(),
                                   label=_('Question kdj'))
    default_response_en = forms.CharField(max_length=160,
                                          required=False,
                                          widget=SMSInput(),
                                          label=_('Default response en'))
    default_response_kdj = forms.CharField(max_length=160,
                                           required=False,
                                           widget=SMSInput(),
                                           label=_('Default response kdj'))
    districts = forms.ModelMultipleChoiceField(
        queryset=Location.objects.filter(
            type__slug='district').order_by('name'),
        required=False,
        label=_('districts'))
    default_response_luo = forms.CharField(max_length=160,
                                           required=False,
                                           widget=SMSInput(),
                                           label=_('Default response luo'))

    # This may seem like a hack, but this allows time for the Contact model
    # to optionally have groups (i.e., poll doesn't explicitly depend on the rapidsms-auth
    # app.
    def __init__(self, data=None, **kwargs):
        queryset = Group.objects.order_by('name')
        if 'request' in kwargs:
            request = kwargs.pop('request')
        if data:
            forms.Form.__init__(self, data, **kwargs)
        else:
            forms.Form.__init__(self, **kwargs)
        try:
            access = Access.objects.get(user=request.user)
            queryset = access.groups.order_by('name')
        except Access.DoesNotExist:
            pass
        except UnboundLocalError:
            pass
        if hasattr(Contact, 'groups'):
            self.fields['groups'] = forms.ModelMultipleChoiceField(
                queryset=queryset, required=False, label=_('groups'))

    def clean(self):
        cleaned_data = self.cleaned_data
        groups = cleaned_data.get('groups')
        if cleaned_data.get('question_en', None):
            cleaned_data['question_en'] = cleaned_data.get(
                'question_en').replace('%', u'\u0025')
        if cleaned_data.get('default_response_en', None):
            cleaned_data['default_response_en'] = cleaned_data[
                'default_response_en'].replace('%', u'\u0025')

        if not groups:
            raise forms.ValidationError(
                _("You must provide a set of recipients (a group or groups)"))

        return cleaned_data

    def clean_default_response_en(self):
        return self._cleaned_default_response(self.data['default_response_en'])

    def clean_default_response_luo(self):
        return self._cleaned_default_response(
            self.data['default_response_luo'])

    def clean_default_response_kdj(self):
        return self._cleaned_default_response(
            self.cleaned_data['default_response_kdj'])

    def _cleaned_default_response(self, default_response):
        return default_response.replace('%', '%%')