예제 #1
0
파일: mixins.py 프로젝트: einarfelix/xl
 def propagate_contact_details(self, ar=None):
     ContactDetailTypes = rt.models.phones.ContactDetailTypes
     watcher = ChangeWatcher(self)
     for cdt in ContactDetailTypes.get_list_items():
         self.propagate_contact_detail(cdt)
     if ar is not None:
         watcher.send_update(ar)
예제 #2
0
 def after_ui_save(self, ar, cw):
     super(Account, self).after_ui_save(ar, cw)
     if self.primary:
         mi = self.partner
         for o in mi.sepa_accounts.exclude(id=self.id):
             if o.primary:
                 o.primary = False
                 o.save()
                 ar.set_response(refresh_all=True)
         watcher = ChangeWatcher(mi)
         for k in PRIMARY_FIELDS:
             setattr(mi, k, getattr(self, k))
         mi.save()
         watcher.send_update(ar.request)
예제 #3
0
    def set_workflow_state(row, ar, state_field, target_state):
        """Called by workflow actions (:class:`ChangeStateAction
        <lino.core.workflows.ChangeStateAction>`) to perform the
        actual state change.

        """
        watcher = ChangeWatcher(row)
        old = getattr(row, state_field.attname)
        target_state.choicelist.before_state_change(row, ar, old, target_state)
        row.before_state_change(ar, old, target_state)
        setattr(row, state_field.attname, target_state)
        row.save()
        target_state.choicelist.after_state_change(row, ar, old, target_state)
        row.after_state_change(ar, old, target_state)
        watcher.send_update(ar.request)
        row.after_ui_save(ar, watcher)
예제 #4
0
파일: duplicable.py 프로젝트: zyrobin/lino
    def run_from_code(self, ar, **known_values):
        obj = ar.selected_rows[0]
        related = []
        for m, fk in obj._lino_ddh.fklist:
            # print(fk.name, m.allow_cascaded_delete, m.allow_cascaded_copy, obj)
            if fk.name in m.allow_cascaded_delete or fk.name in m.allow_cascaded_copy:
                related.append((fk, m.objects.filter(**{fk.name: obj})))

        if AFTER17:
            fields_list = obj._meta.concrete_fields
        else:
            fields_list = obj._meta.fields
        if True:
            for f in fields_list:
                if not f.primary_key:
                    if f.name not in known_values:
                        known_values[f.name] = getattr(obj, f.name)
            new = obj.__class__(**known_values)
            # 20120704 create_instances causes fill_from_person() on a
            # CBSS request.
        else:
            # doesn't seem to want to work
            new = obj
            for f in fields_list:
                if f.primary_key:
                    # causes Django to consider this an unsaved instance
                    setattr(new, f.name, None)

        new.on_duplicate(ar, None)
        new.save(force_insert=True)
        cw = ChangeWatcher(new)

        for fk, qs in related:
            for relobj in qs:
                relobj.pk = None  # causes Django to save a copy
                setattr(relobj, fk.name, new)
                relobj.on_duplicate(ar, new)
                relobj.save(force_insert=True)

        new.after_duplicate(ar, obj)

        if cw.is_dirty():
            new.full_clean()
            new.save()

        return new
예제 #5
0
파일: models.py 프로젝트: forexblog/xl
 def after_ui_save(self, ar, cw):
     super(ContactDetail, self).after_ui_save(ar, cw)
     mi = self.partner
     if mi is None:
         return
     if self.primary and self.detail_type:
         for o in mi.phones_by_partner.exclude(id=self.id).filter(
                 detail_type=self.detail_type):
             if o.primary:
                 o.primary = False
                 o.save()
                 ar.set_response(refresh_all=True)
     k = self.detail_type.field_name
     if k:
         watcher = ChangeWatcher(mi)
         setattr(mi, k, self.value)
         watcher.send_update(ar)
         mi.save()
예제 #6
0
    def process_row(self, ar, obj, attrs):
        """Generate a confirmation which asks to update the given data row
        `obj` using the data read from the eid card (given in `attr`).

        """
        objects, diffs = obj.get_beid_diffs(attrs)

        if len(diffs) == 0:
            return self.goto_client_response(
                ar, obj,
                _("Client %s is up-to-date") % str(obj))

        oldobj = obj
        watcher = ChangeWatcher(obj)

        msg = _("Click OK to apply the following changes for %s") % obj
        msg = simulate_wrap(msg)
        msg += ' :<br/>'
        # UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 10: ordinal not in range(128)
        diffs = [str(i) for i in diffs]
        diffs = sorted(diffs)
        msg += u'\n<br/>'.join(diffs)

        # msg += u'\n<br/>'.join(sorted(diffs))

        def yes(ar2):
            msg = _("%s has been saved.") % dd.obj2unicode(obj)
            if not dd.plugins.beid.read_only_simulate:
                for o in objects:
                    o.full_clean()
                    o.save()
                watcher.send_update(ar2)
            msg = simulate_wrap(msg)
            return self.goto_client_response(ar2, obj, msg)

        def no(ar2):
            return self.goto_client_response(ar2, oldobj)

        #~ print 20131108, msg
        cb = ar.add_callback(msg)
        cb.add_choice('yes', yes, _("Yes"))
        cb.add_choice('no', no, _("No"))
        ar.set_callback(cb)
예제 #7
0
def objects():

    Company = rt.models.contacts.Company

    ar = rt.login(request=PseudoRequest("robin"))

    obj = Company(name="My pub")
    obj.full_clean()
    obj.save_new_instance(ar)

    cw = ChangeWatcher(obj)
    obj.name = "Our pub"
    obj.save_watched_instance(ar, cw)

    obj.delete_instance(ar)

    # this is a special fixture : it creates objects as a side effect
    # but does not yield them.
    return []
예제 #8
0
    def form2obj_and_save(ar, data, elem, is_new):
        """
        Parses the data from HttpRequest to the model instance and saves
        it.

        This is used by `ApiList.post` and `ApiElement.put`, and by
        `Restful.post` and `Restful.put`.

        20140505 : no longer used by ApiList and ApiElement, but still
        by Restful.*
        """
        if is_new:
            watcher = None
        else:
            watcher = ChangeWatcher(elem)
        ar.ah.store.form2obj(ar, data, elem, is_new)
        elem.full_clean()

        if is_new or watcher.is_dirty():
            pre_ui_save.send(sender=elem.__class__, instance=elem, ar=ar)
            elem.before_ui_save(ar)

            kw2save = {}
            if is_new:
                kw2save.update(force_insert=True)
            else:
                kw2save.update(force_update=True)

            elem.save(**kw2save)

            if is_new:
                on_ui_created.send(elem, request=ar.request)
                ar.success(_("%s has been created.") % obj2unicode(elem))
            else:
                watcher.send_update(ar)
                ar.success(_("%s has been updated.") % obj2unicode(elem))
        else:
            ar.success(_("%s : nothing to save.") % obj2unicode(elem))

        elem.after_ui_save(ar, watcher)
예제 #9
0
    def test_comment(self, logger):
        """Test what happens when a comment is posted on a ticket with
        watchers.

        """
        ContentType = rt.models.contenttypes.ContentType
        Comment = rt.models.comments.Comment
        Ticket = rt.models.tickets.Ticket
        Project = rt.models.tickets.Project
        Vote = rt.models.votes.Vote
        Message = rt.models.notify.Message
        User = settings.SITE.user_model
        create(Project, name="Project")
        robin = create(
            User, username='******',
            first_name="Robin",
            user_type=UserTypes.admin)
        aline = create(
            User, username='******',
            first_name="Aline",
            email="*****@*****.**", language='fr')
        obj = create(
            Ticket, summary="Save the world, après moi le déluge",
            user=robin)
        create(Vote, votable=obj, user=aline)
        
        self.assertEqual(Message.objects.count(), 0)
        
        url = "/api/comments/CommentsByRFC"
        post_data = dict()
        post_data[constants.URL_PARAM_ACTION_NAME] = 'submit_insert'
        post_data.update(short_text="I don't agree.")
        post_data[constants.URL_PARAM_MASTER_PK] = obj.pk
        ct = ContentType.objects.get_for_model(Ticket)
        post_data[constants.URL_PARAM_MASTER_TYPE] = ct.id
        # post_data[constants.URL_PARAM_REQUESTING_PANEL] = '123'
        response = self.client.post(
            url, post_data,
            REMOTE_USER='******',
            HTTP_ACCEPT_LANGUAGE='en')
        result = self.check_json_result(
            response, 'rows success message close_window')
        self.assertEqual(result['success'], True)
        self.assertEqual(
            result['message'],
            """Comment "Comment #1" has been created.""")

        self.assertEqual(Message.objects.count(), 1)
        msg = Message.objects.all()[0]
        # self.assertEqual(msg.message_type)
        self.assertEqual(msg.seen, None)
        self.assertEqual(msg.user, aline)
        expected = """Robin a commenté [ticket 1] (Save the world, """\
                   """après moi le déluge): I don't agree."""
        self.assertEqual(expected, msg.body)
        
        # manually set created timestamp so we can test on it later.
        now = datetime.datetime(2016, 12, 22, 19, 45, 55)
        if settings.USE_TZ:
            now = make_aware(now)
        msg.created = now
        msg.save()
        
        settings.SERVER_EMAIL = '*****@*****.**'
        
        with capture_stdout() as out:
            send_pending_emails_often()
            
        out = out.getvalue().strip()
        print(out)

        expected = """send email
Sender: [email protected]
To: [email protected]
Subject: [Django] Robin a comment? #1 (? Save the world, apr?s moi le d?luge)
<body>
(22/12/2016 19:45)
Robin a comment? <a href="http://127.0.0.1:8000/api/tickets/Ticket/1" title="Save the world, apr&#232;s moi le d&#233;luge">#1</a> (Save the world, apr?s moi le d?luge): I don't agree.
</body>
"""        
        self.assertEquivalent(expected, out)
        
        self.assertEqual(logger.debug.call_count, 1)
        logger.debug.assert_called_with(
            'Send out %s summaries for %d users.',
            MailModes.often, 1)
        # logger.info.assert_called_with(
        #     'Notify %s users about %s', 1, 'Change by robin')

        Message.objects.all().delete()
        self.assertEqual(Message.objects.count(), 0)
        
        ar = rt.login('robin')
        cw = ChangeWatcher(obj)
        obj.priority = 200
        obj.save_watched_instance(ar, cw)


        with capture_stdout() as out:
            send_pending_emails_often()
            
        out = out.getvalue().strip()
        # print(out)
        expected = ""
        # self.assertEquivalent(expected, out)
        
        # we do not test the output because the datetime changes. But
        # we actually just wanted to see if there is no
        # UnicodeException. We capture it in order to hide it from
        # test runner output.
        
        self.assertEqual(logger.debug.call_count, 2)
        logger.debug.assert_called_with(
            'Send out %s summaries for %d users.',
            MailModes.often, 1)
예제 #10
0
파일: mixins.py 프로젝트: einarfelix/xl
 def sync_primary_address(self, ar):
     watcher = ChangeWatcher(self)
     self.sync_primary_address_()
     self.save()
     watcher.send_update(ar)
예제 #11
0
 def sync_primary_address(self, request):
     watcher = ChangeWatcher(self)
     self.sync_primary_address_()
     watcher.send_update(request)
예제 #12
0
파일: mixins.py 프로젝트: forexblog/xl
 def sync_primary_address(self, request):
     watcher = ChangeWatcher(self)
     self.sync_from_address(self.get_primary_address())
     self.save()
     watcher.send_update(request)
예제 #13
0
 def save_existing_instance(self, ar):
     watcher = ChangeWatcher(self)
     ar.ah.store.form2obj(ar, ar.rqdata, self, False)
     self.full_clean()
     self.save_watched_instance(ar, watcher)