Ejemplo n.º 1
0
    def test01(self):
        from lino.modlib.users.choicelists import UserTypes
        Ticket = rt.models.tickets.Ticket
        Project = rt.models.tickets.Project
        User = rt.models.users.User
        Star = rt.models.votes.Vote
        # ContentType = rt.models.contenttypes.ContentType
        # ct_Ticket = ContentType.objects.get_for_model(Ticket)

        create(Project, name='project')
        robin = create(User,
                       username='******',
                       first_name="Robin",
                       user_type=UserTypes.admin,
                       language="en")

        def createit():
            return create(Ticket, summary="Test", user=robin)

        #
        # If there are no vetos, user can ask to delete it
        #
        obj = createit()
        obj.delete()

        obj = createit()

        if False:
            try:
                robin.delete()
                self.fail("Expected veto")
            except Warning as e:
                self.assertEqual(
                    str(e), "Cannot delete User Robin "
                    "because 1 Tickets refer to it.")

        create(Star, votable=obj, user=robin)

        try:
            robin.delete()
            self.fail("Expected veto")
        except Warning as e:
            self.assertEqual(
                str(e), "Cannot delete User Robin "
                "because 1 Tickets refer to it.")

        self.assertEqual(Star.objects.count(), 1)
        self.assertEqual(Ticket.objects.count(), 1)

        obj.delete()
        self.assertEqual(Star.objects.count(), 0)
        self.assertEqual(Ticket.objects.count(), 0)
Ejemplo n.º 2
0
    def test01(self):
        from lino.modlib.users.choicelists import UserTypes
        Ticket = rt.models.tickets.Ticket
        Project = rt.models.tickets.Project
        User = rt.models.users.User
        Star = rt.models.votes.Vote
        # ContentType = rt.models.contenttypes.ContentType
        # ct_Ticket = ContentType.objects.get_for_model(Ticket)

        create(Project, name='project')
        robin = create(User, username='******',
                       first_name="Robin",
                       user_type=UserTypes.admin,
                       language="en")

        def createit():
            return create(Ticket, summary="Test", user=robin)

        #
        # If there are no vetos, user can ask to delete it
        #
        obj = createit()
        obj.delete()

        obj = createit()

        if False:
            try:
                robin.delete()
                self.fail("Expected veto")
            except Warning as e:
                self.assertEqual(
                    str(e), "Cannot delete User Robin "
                    "because 1 Tickets refer to it.")

        
        create(Star, votable=obj, user=robin)
        
        try:
            robin.delete()
            self.fail("Expected veto")
        except Warning as e:
            self.assertEqual(
                str(e), "Cannot delete User Robin "
                "because 1 Tickets refer to it.")

        self.assertEqual(Star.objects.count(), 1)
        self.assertEqual(Ticket.objects.count(), 1)

        obj.delete()
        self.assertEqual(Star.objects.count(), 0)
        self.assertEqual(Ticket.objects.count(), 0)
Ejemplo n.º 3
0
    def test01(self):
        from lino.modlib.users.choicelists import UserTypes
        Ticket = rt.models.tickets.Ticket
        Project = rt.models.tickets.Project
        User = rt.models.users.User
        Subscription = rt.models.tickets.Subscription
        Site = rt.models.tickets.Site
        # ContentType = rt.models.contenttypes.ContentType
        # ct_Ticket = ContentType.objects.get_for_model(Ticket)

        site = create(Site, name='project')
        robin = create(User, username='******',
                       first_name="Robin",
                       user_type=UserTypes.admin,
                       language="en")
        create(Subscription, site=site, user=robin)

        def createit():
            return create(Ticket, summary="Test", user=robin, site=site)

        #
        # If there are no vetos, user can ask to delete it
        #
        ticket = createit()
        ticket.delete()

        ticket = createit()

        # we cannot delete the user because a ticket refers to it:

        try:
            robin.delete()
            self.fail("Expected veto")
        except Warning as e:
            self.assertEqual(
                str(e), "Cannot delete User Robin "
                "because 1 Tickets refer to it.")

        
        self.assertEqual(Subscription.objects.count(), 1)
        self.assertEqual(Ticket.objects.count(), 1)

        # when we have deleted the ticket, deleting the user works
        # because the subscription is deleted in cascade:
        
        ticket.delete()
        robin.delete()
        self.assertEqual(Subscription.objects.count(), 0)
        self.assertEqual(Ticket.objects.count(), 0)
        self.assertEqual(User.objects.count(), 0)
Ejemplo n.º 4
0
    def objects(self):

        Team = rt.modules.teams.Team
        self.eupen = create(Team, name="Eupen")
        yield self.eupen
        self.stvith = create(Team, name="St. Vith")
        yield self.stvith

        yield self.load_dbf('USR')

        yield super(TimLoader, self).objects()

        yield self.load_dbf('PLP')

        if False:
            yield self.load_dbf('DLS')
Ejemplo n.º 5
0
    def objects(self):

        Team = rt.modules.teams.Team
        self.eupen = create(Team, name="Eupen")
        yield self.eupen
        self.stvith = create(Team, name="St. Vith")
        yield self.stvith
        
        yield self.load_dbf('USR')
        
        yield super(TimLoader, self).objects()

        yield self.load_dbf('PLP')

        if False:
            yield self.load_dbf('DLS')
Ejemplo n.º 6
0
    def test01(self):
        # print("20180503 test_clients.test01()")
        # NoteType = rt.models.notes.NoteType
        # User = rt.models.users.User
        Journal = ledger.Journal
        Invoice = sales.VatProductInvoice

        self.assertEqual(Journal.objects.count(), 10)
        sls_jnl = Journal.objects.get(ref="SLS")
        self.assertEqual(Invoice.objects.count(), 0)

        robin = create(
            users.User, username="******",
            user_type=UserTypes.admin,
            language="en")

        self.client.force_login(robin)

        kw = dict()
        kw.update(first_name="Max")
        kw.update(last_name="Mustermann")
        kw.update(gender=Genders.male)
        obj = create(contacts.Person, **kw)

        # #3989 (After creating an invoice, Lino forgets the journal) : Lino
        # returned an eval_js instead of a data_record to the submit_insert
        # because it assumed that the detail view is another table:

        url = "/api/sales/InvoicesByJournal"
        data = dict(mk=sls_jnl.pk, mt=21, partnerHidden=obj.pk)
        data.update(an="submit_insert")
        data.update(entry_date="12.03.2015", subject="test")
        response = self.client.post(url, data, REMOTE_USER='******')
        result = self.check_json_result(
            response, 'message close_window success data_record detail_handler_name rows navinfo')

        # just while we are here:
        self.assertEqual(result['success'], True)
        expected = """Sales invoice "SLS #1" has been created."""
        # print(expected)
        self.assertEqual(expected, result['message'])
        self.assertEqual(Invoice.objects.count(), 1)
Ejemplo n.º 7
0
    def objects(self):

        Team = rt.models.teams.Team
        Country = rt.models.countries.Country
        self.eupen = create(Team, name="Eupen")
        yield self.eupen
        self.stvith = create(Team, name="St. Vith")
        yield self.stvith
        
        yield Country(isocode='LU', **dd.str2kw('name', _("Luxemburg")))
        yield Country(isocode='PL', **dd.str2kw('name', _("Poland")))
        yield Country(isocode='AU', **dd.str2kw('name', _("Austria")))
        yield Country(isocode='US', short_code='USA',
                      **dd.str2kw('name', _("United States")))
        yield self.load_dbf('USR')
        
        yield super(TimLoader, self).objects()

        yield self.load_dbf('PLP')

        if False:
            yield self.load_dbf('DLS')
Ejemplo n.º 8
0
    def objects(self):

        Team = rt.models.teams.Team
        Country = rt.models.countries.Country
        self.eupen = create(Team, name="Eupen")
        yield self.eupen
        self.stvith = create(Team, name="St. Vith")
        yield self.stvith

        yield Country(isocode='LU', **dd.str2kw('name', _("Luxemburg")))
        yield Country(isocode='PL', **dd.str2kw('name', _("Poland")))
        yield Country(isocode='AU', **dd.str2kw('name', _("Austria")))
        yield Country(isocode='US',
                      short_code='USA',
                      **dd.str2kw('name', _("United States")))
        yield self.load_dbf('USR')

        yield super(TimLoader, self).objects()

        yield self.load_dbf('PLP')

        if False:
            yield self.load_dbf('DLS')
Ejemplo n.º 9
0
    def test01(self):
        # print("20180503 test_clients.test01()")
        from lino.api.shell import pcsw, users
        # NoteType = rt.models.notes.NoteType
        EventType = rt.models.notes.EventType
        Note = rt.models.notes.Note
        Coaching = rt.models.coachings.Coaching
        Message = rt.models.notify.Message

        robin = create(users.User,
                       username="******",
                       user_type=UserTypes.admin,
                       language="fr")

        self.client.force_login(robin)
        aline = create(users.User,
                       username="******",
                       user_type=UserTypes.admin,
                       language="fr")

        nt = create(EventType, name="System note")
        settings.SITE.site_config.update(system_note_type=nt)

        kw = dict()
        kw.update(first_name="Max")
        kw.update(last_name="Mustermann")
        kw.update(gender=Genders.male, client_state=ClientStates.newcomer)
        obj = create(pcsw.Client, **kw)
        create(Coaching, client=obj, user=aline)

        # settings.SITE.verbose_client_info_message = True
        """Run do_update_events a first time

        """

        url = "/api/pcsw/Clients/{0}?sr={0}".format(obj.pk)
        reason = "Wohnt%20noch%20in%20L%C3%BCttich.%20Wollte%20nach%20Eupen%20ziehen.%20Noch%20nicht%20zust%C3%A4ndig"
        url += "&fv=20&fv={}g&an=refuse_client".format(reason)

        response = self.client.get(url, REMOTE_USER='******')
        result = self.check_json_result(response,
                                        'message close_window success alert')

        self.assertEqual(result['success'], True)

        expected = """\
robin a class\xe9 MUSTERMANN Max (100) comme <b>Refus\xe9</b>."""
        # print(expected)
        self.assertEqual(expected, result['message'])
        self.assertEqual(Note.objects.count(), 1)
        self.assertEqual(Message.objects.count(), 1)
        msg = Message.objects.all()[0]
        expected = """\
robin a classé [client 100] (M. Max MUSTERMANN) comme <b>Refusé</b>.
Raison de refus: CPAS n'est pas compétent
Wohnt noch in Lüttich. Wollte nach Eupen ziehen. Noch nicht zuständigg"""
        self.assertEqual(expected, msg.body)
Ejemplo n.º 10
0
    def test_insert_person(self):
        # ContentType = rt.models.contenttypes.ContentType
        # Person = rt.models.contacts.Person
        Partner = rt.models.contacts.Partner
        ContactDetail = rt.models.phones.ContactDetail
        User = settings.SITE.user_model
        # create(Project, name="Project")
        robin = create(
            User, username='******',
            first_name="Robin",
            user_type=UserTypes.admin)
        # ar = rt.login('robin')
        # self.client.force_login(ar.user)
        url = "/api/contacts/Persons"
        post_data = dict()
        post_data[constants.URL_PARAM_ACTION_NAME] = 'submit_insert'
        post_data.update(first_name="Joe", last_name="Meyer",
                         email="*****@*****.**")
        self.client.force_login(robin)
        response = self.client.post(
            url, post_data,
            REMOTE_USER='******',
            HTTP_ACCEPT_LANGUAGE='en')
        result = self.check_json_result(
            response, 'rows success message close_window navinfo eval_js')
        self.assertEqual(result['success'], True)
        self.assertEqual(
            result['message'],
            """Person "Joe Meyer" has been created.""")

        # print(Partner.objects.all())
        joe = Partner.objects.get(pk=100)
        self.assertEqual(joe.email, "*****@*****.**")
        self.assertEqual(ContactDetail.objects.count(), 1)
        cd = ContactDetail.objects.all()[0]
        self.assertEqual(cd.partner, joe)
        self.assertEqual(cd.value, "*****@*****.**")
Ejemplo n.º 11
0
    def load_dls(self, row, **kw):
        if not row.iddls.strip():
            return
        # if not row.idpin.strip():
        #     return
        pk = row.iddls.strip()
        idusr = row.idusr.strip()
        if pk.startswith('E'):
            team = self.eupen
            pk = int(pk[1:])
        elif pk.startswith('S'):
            team = self.stvith
            pk = int(pk[1:]) + 1000000

        if pk in self.imported_sessions:
            dd.logger.warning(
                "Cannot import duplicate session %s", pk)
            return
        self.imported_sessions.add(pk)
        u = self.get_user(idusr)
        if u is None:
            dd.logger.warning(
                "Cannot import session %s because there is no user %s",
                pk, idusr)
            return
        
        if u.team != team:
            u1 = u
            idusr += '@' + str(team.pk)
            try:
                u = User.objects.get(username=idusr)
            except User.DoesNotExist:
                u = create(
                    User, username=idusr, first_name=u1.first_name, team=team,
                    profile=u1.profile)
            
        kw.update(user=u)
        kw.update(id=pk)
        # if row.idprj.strip():
        #     kw.update(project_id=int(row.idprj))
            # kw.update(partner_id=PRJPAR.get(int(row.idprj),None))
        if row.idpar.strip():
            idpar = self.par_pk(row.idpar.strip())
            try:
                ticket = Partner.objects.get(id=idpar)
                kw.update(ticket=ticket)
            except Partner.DoesNotExist:
                dd.logger.warning(
                    "Cannot import session %s because there is no partner %d",
                    pk, idpar)
                return
                
        kw.update(summary=row.nb.strip())
        kw.update(start_date=row.date)

        def set_time(kw, fldname, v):
            v = v.strip()
            if not v:
                return
            if v == '24:00':
                v = '0:00'
            kw[fldname] = v

        set_time(kw, 'start_time', row.von)
        set_time(kw, 'end_time', row.bis)
        # set_time(kw, 'break_time', row.pause)
        # kw.update(start_time=row.von.strip())
        # kw.update(end_time=row.bis.strip())
        # kw.update(break_time=row.pause.strip())
        # kw.update(is_private=tim2bool(row.isprivat))
        obj = clocking.Session(**kw)
        # if row.idpar.strip():
            # partner_id = self.par_pk(row.idpar)
            # if obj.project and obj.project.partner \
                # and obj.project.partner.id == partner_id:
                # pass
            # elif obj.ticket and obj.ticket.partner \
                # and obj.ticket.partner.id == partner_id:
                # pass
            # else:
                # ~ dblogger.warning("Lost DLS->IdPar of DLS#%d" % pk)
        yield obj
Ejemplo n.º 12
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)
Ejemplo n.º 13
0
    def load_dls(self, row, **kw):
        pk = row.iddls.strip()
        # if not row.idpin.strip():
        #     return
        if pk.startswith('E'):
            team = self.eupen
            pk = int(pk[1:])
        elif pk.startswith('S'):
            team = self.stvith
            pk = int(pk[1:]) + 1000000
            # Cannot import duplicate session 104877
        if not pk:
            return

        if pk in self.imported_sessions:
            dd.logger.warning(
                "Cannot import duplicate session %s", pk)
            return
        idusr = row.idusr.strip()
        u = self.get_user(idusr)
        if u is None:
            dd.logger.warning(
                "Cannot import session %s because there is no user %s",
                pk, idusr)
            return
        
        if u.team != team:
            u1 = u
            # idusr += '@' + str(team.pk)
            idusr += '@' + str(team)
            try:
                u = User.objects.get(username=idusr)
            except User.DoesNotExist:
                u = create(
                    User, username=idusr, first_name=u1.first_name, team=team,
                    user_type=u1.user_type)
                dd.logger.info("Created new user %s", u)
            
        kw.update(user=u)
        kw.update(id=pk)

        iddla = row.iddla.strip()
        if iddla:
            dla = self.get_event_type(iddla)
            kw.update(event_type=dla)
        
        v = row.etat.strip()
        if v:
            kw.update(state=self.get_event_state(v))
        
        
        # if row.idprj.strip():
        #     kw.update(project_id=int(row.idprj))
            # kw.update(partner_id=PRJPAR.get(int(row.idprj),None))
        idpar = row.idpar.strip()
        if not idpar:
            dd.logger.info("Missing IdPar in DLS:%s", pk)
            return
        try:
            course = Course.get_by_ref(idpar)
        except Course.DoesNotExist:
            course = Course(
                state=CourseStates.draft,
                ref=idpar, line=self.other_groups)
            dd.logger.info("Created new therapy %s", course)
            yield course
            
        self.imported_sessions.add(pk)
        kw.update(**gfk2lookup(Event.owner, course))
        kw.update(summary=row.nb.strip())
        kw.update(start_date=row.date)

        def set_time(kw, fldname, v):
            v = v.strip()
            if not v:
                return
            if v == '24:00':
                v = '0:00'
            kw[fldname] = v

        set_time(kw, 'start_time', row.von)
        set_time(kw, 'end_time', row.bis)
        obj = Event(**kw)
        yield obj
Ejemplo n.º 14
0
    def load_par(self, row):
        # Every PAR potentially yields a partner, a course and an
        # enrolment.  we re-create all courses and enrolments from
        # scratch but don't modify existing partners a therapeutic
        # group (IdPrt=="T") generates only a course (no partner and
        # no enrolment). Enrolments for T and G are added later from
        # PLP.
        
        # kw = dict()
        pk = self.par_pk(row.idpar)
        if pk is None:
            return
        name = row.firme.strip()
        if row.name2.strip():
            name += "-" + row.name2.strip()
        name += ' ' + row.vorname.strip()
        prt = row.idprt
        ref = row.idpar.strip()
        
        cl = self.par_class(row)
        if cl is None:
            partner = None
        else:
            try:
                partner = cl.objects.get(pk=pk)
                dd.logger.debug(
                    "Update existing %s %s from %s", cl.__name__, pk, row)
            except cl.DoesNotExist:
                try:
                    partner = Partner.objects.get(pk=pk)
                except Partner.DoesNotExist:
                    dd.logger.debug("Create new %s %s from %s",
                                    cl.__name__, pk, row)
                    partner = timloader1.TimLoader.load_par(self, row).next()
                else:
                    dd.logger.debug(
                        "Specialize partner %s to %s (from %s)",
                        pk, cl.__name__, row)
                    if cl is Client:
                        # A Partner cannot be parent for a Client
                        insert_child(partner, Person, True)
                        partner = Person.objects.get(pk=pk)
                    insert_child(partner, cl, True)
                    partner = cl.objects.get(pk=pk)
            # PAR->Name2 was not imported in spzloader1
            partner.name = name
            yield partner  # yield a first time to get the pk

        if prt == "T":
            kw = dict(name=name, line=self.other_groups, id=pk)
            kw.update(ref=ref)
            course = Course(**kw)
            yield course

        elif prt == "G":
            if not isinstance(partner, Household):
                msg = "Partner of life group {} is not a household!?"
                dd.logger.warning(msg.format(pk))
            kw = par2dates(row)
            kw.update(
                name=name, line=self.life_groups, id=partner.id,
                partner_id=partner.id)
            kw.update(ref=ref)
            course = Course(**kw)
            yield course
        
        elif prt == "P":
            # if Course.objects.filter(id=obj.id).exists():
            #     return
            # if Course.objects.filter(ref=row.idpar.strip()).exists():
            #     return
            kw = par2dates(row)
            kw.update(
                line=self.therapies,
                partner_id=partner.id,
                name=name, id=partner.id,
                ref=ref)
            course = Course(**kw)
            yield course
            kw = par2dates(row)
            kw.update(
                state=EnrolmentStates.get_by_value(row.stand) \
                or EnrolmentStates.inactive)
            yield Enrolment(pupil=partner, course=course, **kw)
            dd.logger.debug("Created enrolment for therapy %s", partner)
        else:
            course  = None
                    

        if course is not None:
            v = row.stand
            if v:
                course.state = CourseStates.get_by_value(v) \
                               or CourseStates.inactive
            u1, u2, u3 = self.get_users(row)
            course.user = course.teacher = u2 or u1
            if row.idpar.startswith('E'):
                course.team = self.eupen
            elif row.idpar.startswith('S'):
                course.team = self.stvith
            
        if isinstance(partner, Partner):
            if row.gsm:
                partner.gsm = row.gsm

            # if row.idpar.startswith('E'):
            #     partner.team = self.eupen
            # elif row.idpar.startswith('S'):
            #     partner.team = self.stvith
            idpar2 = row.idpar2.strip()
            if idpar2 and (row.idpar.strip() != idpar2):
                idpar2 = self.par_pk(idpar2)
                if idpar2 is not None:
                    self.obsolete_list.append((partner, idpar2))

            ga = self.get_account(row.idgen)
            if ga is not None:
                partner.purchase_account = ga
            
                    

        if isinstance(partner, Person):
            v = row.gebdat
            if isinstance(v, basestring):
                v = dateparser.parse(v.strip())
            if v:
                partner.birth_date = v
            v = row.sexe
            if v:
                partner.gender = convert_gender(v)

        # if isinstance(partner, (Client, Household)):
        if course is not None:

            v = row.attrib
            if v:
                if "D" in v:
                    course.translator_type = TranslatorTypes.interpreter
                    
            v = row.tarif
            if v:
                t = rt.models.courses.PartnerTariffs.get_by_value(v)
                if t is None:
                    dd.logger.warning(
                        "Cannot handle tariff {}".format(v))
                else:
                    course.partner_tariff = t

            v = row.bereich
            if v:
                t = rt.models.courses.TherapyDomains.get_by_value(v)
                if t is None:
                    dd.logger.warning(
                        "Cannot handle domain {}".format(v))
                else:
                    course.therapy_domain = t
                    
            course.procurer = fld2fk(row.vermitt, Procurer)
            if row.vpfl == "X":
                course.mandatory = True

            v = self.get_partner(Company, row.kkasse)
            if v:
                qs = hc_Plan.objects.filter(provider=v).order_by('id')
                if qs.exists():
                    hcp = qs.first()
                else:
                    hcp = hc_Plan(provider=v, designation=str(v))
                    yield hcp
                partner.healthcare_plan = hcp
                    

                

        if isinstance(partner, Client):
            
            # ClientStates = rt.models.clients.ClientStates
            # v = row.stand
            # if v:
            #     v = ClientStates.get_by_value(v)
            # if v:
            #     partner.client_state = v
            # else:
            #     partner.client_state = ClientStates.cancelled
            #     # dd.logger.info(
            #     #     "%s : invalid PAR->Stand %s", row, row.stand)

            v = row.idnat
            if v:
                try:
                    obj = Country.objects.get(isocode=v)
                except Country.DoesNotExist:
                    obj = create(Country, name=v, isocode=v)
                    yield obj
                    dd.logger.info("Inserted new country %s ", v)
                    return
                partner.nationality = obj
            # 1 ledig       
            # 2 verheiratet 
            # 3 verwitwet   
            # 4 getrennt    
            # 5 geschieden
            v = self.civil_states.get(row.zivilst)
            if v:
                partner.civil_state = CivilStates.get_by_value(v)
            
            v = row.beruf
            if v == '10': v = '11'
            elif v == '20': v = '11'
            elif v == '30': v = '31'
            elif v == '40': v = '31'
            partner.professional_state = ProfessionalStates.get_by_value(v)

            partner.life_mode = fld2fk(row.lebensw, LifeMode)

        # partner.propagate_contact_details()

        if row.zahler.strip():
            v = self.get_partner(Partner, row.zahler)
            if v:
                if isinstance(partner, Partner):
                    yield SalesRule(partner=partner, invoice_recipient=v)
                if course is not None:
                    course.partner = v
            else:
                dd.logger.info(
                    "Could not import zahler %s", row.zahler)

        if isinstance(partner, Client):
            v = self.get_partner(Company, row.kkasse)
            if v:
                cct = rt.models.clients.ClientContactType.objects.get(pk=1)
                yield rt.models.clients.ClientContact(
                    type=cct, client=partner, company=v)

            v = self.get_partner(Person, row.hausarzt)
            if v:
                cct = rt.models.clients.ClientContactType.objects.get(pk=2)
                yield rt.models.clients.ClientContact(
                    type=cct, client=partner, contact_person=v)

        
        yield partner
        yield course
Ejemplo n.º 15
0
 def createit():
     return create(Ticket, summary="Test", user=robin)
Ejemplo n.º 16
0
    def test01(self):
        Enrolment = rt.models.courses.Enrolment
        Pupil = rt.models.courses.Pupil
        Line = rt.models.courses.Line
        Course = rt.models.courses.Course
        CourseStates = rt.models.courses.CourseStates
        EnrolmentStates = rt.models.courses.EnrolmentStates
        EventType = rt.models.cal.EventType

        
        # room = create(cal.Room, name="First Room")
        lesson = create(EventType, name="Lesson", event_label="Lesson")
        line = create(Line, name="First Line", event_type=lesson)
        obj = create(
            Course,
            line=line,
            # room=room,
            max_places=3,
            #monday=True,
            #start_date=i2d(20140110),
            state=courses.CourseStates.active)
        self.assertEqual(str(obj), "Activity #1")

        # self.assertEqual(settings.SITE.kernel.site, settings.SITE)
        # self.assertEqual(settings.SITE, dd.site)
        # self.assertEqual(settings.SITE.plugins, dd.plugins)
        # self.assertEqual(settings.SITE.plugins.extjs, dd.plugins.extjs)

        settings.SITE.verbose_client_info_message = True
        users.User(username="******",
                   user_type=UserTypes.admin,
                   language="en").save()
        ses = settings.SITE.login('robin')

        anna = create(Pupil, first_name="Anna")
        bert = create(Pupil, first_name="Bert")
        claire = create(Pupil, first_name="Claire")
        ernie = create(Pupil, first_name="Ernie")

        def ENR(p, start_date, **kwargs):
            return create(
                Enrolment, course=obj, pupil=p,
                state=EnrolmentStates.confirmed,
                start_date=start_date, **kwargs)

        # anna and ernie participated from the beginning.
        # bert stopped in may, and claire started in june.
        # so there were never more than 3 participants.

        # 2015-12-31 : 0 participants, 3 free places
        # 2016-01-01 : 3 participants
        # 2016-05-01 : bert leaves. 2 participants
        # 2016-06-01 : claire starts. 3 participants
        
        ENR(anna, i2d(20160101))
        ENR(bert, i2d(20160101), end_date=i2d(20160501))
        ENR(claire, i2d(20160601))
        ENR(ernie, i2d(20160101))

        self.assertEqual(obj.get_free_places(i2d(20151231)), 3)
        self.assertEqual(obj.get_free_places(i2d(20160101)), 0)
        self.assertEqual(obj.get_free_places(i2d(20160301)), 0)
        self.assertEqual(obj.get_free_places(i2d(20160531)), 1)
        self.assertEqual(obj.get_free_places(i2d(20161231)), 0)
        
        #self.assertEqual(enr.get_confirm_veto(None), '')

        # 20180731 the default value for the enrolment state was a
        # string which became an EnrolmentStates choice only during
        # full_clean().  Now this case is being resolved in
        # ChoiceListField.__init__().
        
        enr = Enrolment(course=obj, pupil=anna)
        self.assertEqual(enr.state, EnrolmentStates.requested)
Ejemplo n.º 17
0
    def test01(self):
        from lino.modlib.users.choicelists import UserTypes
        Ticket = rt.models.tickets.Ticket
        # Project = rt.models.tickets.Project
        # Line = rt.models.courses.Line
        # Activity = rt.models.courses.Course
        # Enrolment = rt.models.courses.Enrolment
        # Meeting = rt.models.meetings.Meeting
        Change = rt.models.changes.Change
        User = rt.models.users.User
        # Vote = rt.models.votes.Vote
        # VoteStates = rt.models.votes.VoteStates
        # VotesByVotable = rt.models.votes.VotesByVotable
        # ContentType = rt.models.contenttypes.ContentType
        # ct_Ticket = ContentType.objects.get_for_model(Ticket)

        # create(Project, name='project')

        robin = create(User, username='******',
                       first_name="Robin",
                       user_type=UserTypes.admin,
                       language="en")
        anna = create(User, username='******',
                      first_name="Anna",
                      user_type=UserTypes.user,
                      language="en")
        berta = create(User, username='******',
                       first_name="Berta",
                       user_type=UserTypes.user,
                       language="en")
        # meeting = create(Meeting, name="Test")
        # sprints = create(Line, name="Sprints")
        # sprint = create(Activity, line=sprints)
        #
        # Enrolment(course=sprint, pupil=robin)
        
        ses = rt.login('robin')
        
        ticket = create(Ticket, summary="First", user=robin)
        ticket.after_ui_save(ses, None)
        # vote = Vote.objects.get(votable=ticket)
        # self.assertEqual(vote.user, robin)
        # self.assertEqual(vote.state, VoteStates.author)
        
        def check_success(ia, **kwargs):
            rv = ia.run_from_session(ses, **kwargs)
            self.assertEqual(rv, {'success': True, 'refresh': True})

        check_success(ticket.mark_talk)
        check_success(ticket.mark_started)
        check_success(ticket.mark_refused)
        check_success(ticket.mark_closed)
        check_success(ticket.mark_refused)
        
        # Vote.objects.all().delete()
        Ticket.objects.all().delete()
        
        # self.assertEqual(Vote.objects.count(), 0)

        ticket = create(
            Ticket, summary="Second", user=robin, end_user=anna)
        ticket.after_ui_save(ses, None)
Ejemplo n.º 18
0
    def test_comment(self, logger):
        """Test what happens when a comment is posted on a ticket with
        watchers.

        """
        ContentType = rt.modules.contenttypes.ContentType
        Comment = rt.models.comments.Comment
        Ticket = rt.modules.tickets.Ticket
        Vote = rt.modules.votes.Vote
        Message = rt.modules.notify.Message
        User = settings.SITE.user_model

        robin = create(User, username='******', profile=UserTypes.admin)
        aline = create(User, username='******', email="*****@*****.**")
        obj = create(Ticket, summary="Save the world", reporter=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
        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)
        self.assertEqual(msg.body, """\
robin commented on #1 (Save the world): I don't agree.""")


        settings.SERVER_EMAIL = '*****@*****.**'
        
        with capture_stdout() as out:
            send_pending_emails_often()

        out = out.getvalue().strip()
        # print(out)
        self.assertEquivalent(out, """send email
Sender: [email protected]
To: [email protected]
Subject: [Django] Change in Comment #1

<body>
<p>aline,</p>

robin commented on #1 (Save the world): I don't agree.

<p>Subsequent changes to Comment #1 will not be notified until you visit http://team.lino-framework.org/ and mark this notification as seen.</p>

</body>
""")
        
        self.assertEqual(logger.debug.call_count, 1)
        logger.debug.assert_called_with(
            "Send out emails for %d messages.", 1)
        logger.info.assert_called_with(
            'Notify %s users about %s', 1, 'Change by robin')
Ejemplo n.º 19
0
    def load_dls(self, row, **kw):
        pk = row.iddls.strip()
        # if not row.idpin.strip():
        #     return
        if pk.startswith('E'):
            team = self.eupen
            pk = int(pk[1:])
        elif pk.startswith('S'):
            team = self.stvith
            pk = int(pk[1:]) + 1000000
            # Cannot import duplicate session 104877
        if not pk:
            return

        if pk in self.imported_sessions:
            dd.logger.warning("Cannot import duplicate session %s", pk)
            return
        idusr = row.idusr.strip()
        u = self.get_user(idusr)
        if u is None:
            dd.logger.warning(
                "Cannot import session %s because there is no user %s", pk,
                idusr)
            return

        if u.team != team:
            u1 = u
            # idusr += '@' + str(team.pk)
            idusr += '@' + str(team)
            try:
                u = User.objects.get(username=idusr)
            except User.DoesNotExist:
                u = create(User,
                           username=idusr,
                           first_name=u1.first_name,
                           team=team,
                           user_type=u1.user_type)
                dd.logger.info("Created new user %s", u)

        kw.update(user=u)
        kw.update(id=pk)

        iddla = row.iddla.strip()
        if iddla:
            dla = self.get_event_type(iddla)
            kw.update(event_type=dla)

        v = row.etat.strip()
        if v:
            kw.update(state=self.get_event_state(v))

        # if row.idprj.strip():
        #     kw.update(project_id=int(row.idprj))
        # kw.update(partner_id=PRJPAR.get(int(row.idprj),None))
        idpar = row.idpar.strip()
        if not idpar:
            dd.logger.info("Missing IdPar in DLS:%s", pk)
            return
        try:
            course = Course.get_by_ref(idpar)
        except Course.DoesNotExist:
            course = Course(state=CourseStates.draft,
                            ref=idpar,
                            line=self.other_groups)
            dd.logger.info("Created new therapy %s", course)
            yield course

        self.imported_sessions.add(pk)
        kw.update(**gfk2lookup(Event.owner, course))
        kw.update(summary=row.nb.strip())
        kw.update(start_date=row.date)

        def set_time(kw, fldname, v):
            v = v.strip()
            if not v:
                return
            if v == '24:00':
                v = '0:00'
            kw[fldname] = v

        set_time(kw, 'start_time', row.von)
        set_time(kw, 'end_time', row.bis)
        obj = Event(**kw)
        yield obj
Ejemplo n.º 20
0
    def load_par(self, row):
        # Every PAR potentially yields a partner, a course and an
        # enrolment.  we re-create all courses and enrolments from
        # scratch but don't modify existing partners a therapeutic
        # group (IdPrt=="T") generates only a course (no partner and
        # no enrolment). Enrolments for T and G are added later from
        # PLP.

        # kw = dict()
        pk = self.par_pk(row.idpar)
        if pk is None:
            return
        name = row.firme.strip()
        if row.name2.strip():
            name += "-" + row.name2.strip()
        name += ' ' + row.vorname.strip()
        prt = row.idprt
        ref = row.idpar.strip()

        cl = self.par_class(row)
        if cl is None:
            partner = None
        else:
            try:
                partner = cl.objects.get(pk=pk)
                dd.logger.debug("Update existing %s %s from %s", cl.__name__,
                                pk, row)
            except cl.DoesNotExist:
                try:
                    partner = Partner.objects.get(pk=pk)
                except Partner.DoesNotExist:
                    dd.logger.debug("Create new %s %s from %s", cl.__name__,
                                    pk, row)
                    partner = timloader1.TimLoader.load_par(self, row).next()
                else:
                    dd.logger.debug("Specialize partner %s to %s (from %s)",
                                    pk, cl.__name__, row)
                    if cl is Client:
                        # A Partner cannot be parent for a Client
                        insert_child(partner, Person, True)
                        partner = Person.objects.get(pk=pk)
                    insert_child(partner, cl, True)
                    partner = cl.objects.get(pk=pk)
            # PAR->Name2 was not imported in spzloader1
            partner.name = name
            yield partner  # yield a first time to get the pk

        if prt == "T":
            kw = dict(name=name, line=self.other_groups, id=pk)
            kw.update(ref=ref)
            course = Course(**kw)
            yield course

        elif prt == "G":
            if not isinstance(partner, Household):
                msg = "Partner of life group {} is not a household!?"
                dd.logger.warning(msg.format(pk))
            kw = par2dates(row)
            kw.update(name=name,
                      line=self.life_groups,
                      id=partner.id,
                      partner_id=partner.id)
            kw.update(ref=ref)
            course = Course(**kw)
            yield course

        elif prt == "P":
            # if Course.objects.filter(id=obj.id).exists():
            #     return
            # if Course.objects.filter(ref=row.idpar.strip()).exists():
            #     return
            kw = par2dates(row)
            kw.update(line=self.therapies,
                      partner_id=partner.id,
                      name=name,
                      id=partner.id,
                      ref=ref)
            course = Course(**kw)
            yield course
            kw = par2dates(row)
            kw.update(
                state=EnrolmentStates.get_by_value(row.stand) \
                or EnrolmentStates.inactive)
            yield Enrolment(pupil=partner, course=course, **kw)
            dd.logger.debug("Created enrolment for therapy %s", partner)
        else:
            course = None

        if course is not None:
            v = row.stand
            if v:
                course.state = CourseStates.get_by_value(v) \
                               or CourseStates.inactive
            u1, u2, u3 = self.get_users(row)
            course.user = course.teacher = u2 or u1
            if row.idpar.startswith('E'):
                course.team = self.eupen
            elif row.idpar.startswith('S'):
                course.team = self.stvith

        if isinstance(partner, Partner):
            if row.gsm:
                partner.gsm = row.gsm

            # if row.idpar.startswith('E'):
            #     partner.team = self.eupen
            # elif row.idpar.startswith('S'):
            #     partner.team = self.stvith
            idpar2 = row.idpar2.strip()
            if idpar2 and (row.idpar.strip() != idpar2):
                idpar2 = self.par_pk(idpar2)
                if idpar2 is not None:
                    self.obsolete_list.append((partner, idpar2))

            ga = self.get_account(row.idgen)
            if ga is not None:
                partner.purchase_account = ga

        if isinstance(partner, Person):
            v = row.gebdat
            if isinstance(v, basestring):
                v = dateparser.parse(v.strip())
            if v:
                partner.birth_date = v
            v = row.sexe
            if v:
                partner.gender = convert_gender(v)

        # if isinstance(partner, (Client, Household)):
        if course is not None:

            v = row.attrib
            if v:
                if "D" in v:
                    course.translator_type = TranslatorTypes.interpreter

            v = row.tarif
            if v:
                t = rt.models.courses.PartnerTariffs.get_by_value(v)
                if t is None:
                    dd.logger.warning("Cannot handle tariff {}".format(v))
                else:
                    course.partner_tariff = t

            v = row.bereich
            if v:
                t = rt.models.courses.TherapyDomains.get_by_value(v)
                if t is None:
                    dd.logger.warning("Cannot handle domain {}".format(v))
                else:
                    course.therapy_domain = t

            course.procurer = fld2fk(row.vermitt, Procurer)
            if row.vpfl == "X":
                course.mandatory = True

            v = self.get_partner(Company, row.kkasse)
            if v:
                qs = hc_Plan.objects.filter(provider=v).order_by('id')
                if qs.exists():
                    hcp = qs.first()
                else:
                    hcp = hc_Plan(provider=v, designation=str(v))
                    yield hcp
                partner.healthcare_plan = hcp

        if isinstance(partner, Client):

            # ClientStates = rt.models.clients.ClientStates
            # v = row.stand
            # if v:
            #     v = ClientStates.get_by_value(v)
            # if v:
            #     partner.client_state = v
            # else:
            #     partner.client_state = ClientStates.cancelled
            #     # dd.logger.info(
            #     #     "%s : invalid PAR->Stand %s", row, row.stand)

            v = row.idnat
            if v:
                try:
                    obj = Country.objects.get(isocode=v)
                except Country.DoesNotExist:
                    obj = create(Country, name=v, isocode=v)
                    yield obj
                    dd.logger.info("Inserted new country %s ", v)
                    return
                partner.nationality = obj
            # 1 ledig
            # 2 verheiratet
            # 3 verwitwet
            # 4 getrennt
            # 5 geschieden
            v = self.civil_states.get(row.zivilst)
            if v:
                partner.civil_state = CivilStates.get_by_value(v)

            v = row.beruf
            if v == '10': v = '11'
            elif v == '20': v = '11'
            elif v == '30': v = '31'
            elif v == '40': v = '31'
            partner.professional_state = ProfessionalStates.get_by_value(v)

            partner.life_mode = fld2fk(row.lebensw, LifeMode)

        # partner.propagate_contact_details()

        if row.zahler.strip():
            v = self.get_partner(Partner, row.zahler)
            if v:
                if isinstance(partner, Partner):
                    yield SalesRule(partner=partner, invoice_recipient=v)
                if course is not None:
                    course.partner = v
            else:
                dd.logger.info("Could not import zahler %s", row.zahler)

        if isinstance(partner, Client):
            v = self.get_partner(Company, row.kkasse)
            if v:
                cct = rt.models.clients.ClientContactType.objects.get(pk=1)
                yield rt.models.clients.ClientContact(type=cct,
                                                      client=partner,
                                                      company=v)

            v = self.get_partner(Person, row.hausarzt)
            if v:
                cct = rt.models.clients.ClientContactType.objects.get(pk=2)
                yield rt.models.clients.ClientContact(type=cct,
                                                      client=partner,
                                                      contact_person=v)

        yield partner
        yield course
Ejemplo n.º 21
0
    def load_par(self, row):
        # Every PAR potentially yields a partner, a course and an
        # enrolment.  we re-create all courses and enrolments from
        # scratch but don't modify existing partners a therapeutic
        # group (IdPrt=="T") generates only a course (no partner and
        # no enrolment). Enrolments for T and G are added later from
        # PLP.
        
        # kw = dict()
        pk = self.par_pk(row.idpar)
        if pk is None:
            return
        name = row.firme.strip() + ' ' + row.vorname.strip()
        prt = row.idprt
        ref = row.idpar.strip()
        
        if prt == "T":
            kw = dict(name=name, line=self.other_groups, id=pk)
            kw.update(ref=ref)
            for user in self.get_users(row):
                kw.update(teacher=user)
                break
            yield Course(**kw)
            return

        cl = self.par_class(row)
        if cl is None:
            return
        partner = None
        try:
            partner = cl.objects.get(pk=pk)
            dd.logger.info(
                "Update existing %s %s from %s", cl.__name__, pk, row)
        except cl.DoesNotExist:
            try:
                partner = Partner.objects.get(pk=pk)
            except Partner.DoesNotExist:
                dd.logger.info("Create new %s %s from %s",
                               cl.__name__, pk, row)
                partner = timloader1.TimLoader.load_par(self, row).next()
            else:
                dd.logger.info(
                    "Specialize partner %s to %s (from %s)",
                    pk, cl.__name__, row)
                if cl is Client:
                    # A Partner cannot be parent for a Client
                    insert_child(partner, Person, True)
                    partner = Person.objects.get(pk=pk)
                insert_child(partner, cl, True)
                partner = cl.objects.get(pk=pk)


        if isinstance(partner, Partner):
            if row.gsm:
                partner.gsm = row.gsm

            if row.idpar.startswith('E'):
                partner.team = self.eupen
            elif row.idpar.startswith('S'):
                partner.team = self.stvith
            idpar2 = row.idpar2.strip()
            if idpar2 and (row.idpar.strip() != idpar2):
                idpar2 = self.par_pk(idpar2)
                if idpar2 is not None:
                    self.obsolete_list.append((partner, idpar2))

            ga = self.get_account(row.idgen)
            if ga is not None:
                partner.purchase_account = ga
            
                    

        if issubclass(cl, Person):
            v = row.gebdat
            if isinstance(v, basestring):
                partner.birth_date = dateparser.parse(v.strip())
            v = row.sexe
            if v:
                partner.gender = convert_gender(v)

            v = row.beruf
            if v:
                v = rt.models.tera.ProfessionalStates.get_by_value(v)
                partner.professional_state = v

        if issubclass(cl, (Client, Household)):

            v = row.tarif
            if v:
                t = rt.models.tera.PartnerTariffs.get_by_value(v)
                if t is None:
                    dd.logger.warning(
                        "Cannot handle tariff {}".format(v))
                else:
                    partner.tariff = t

            ClientStates = rt.models.clients.ClientStates
            v = row.stand
            if v:
                v = ClientStates.get_by_value(v)
            if v:
                partner.client_state = v
            else:
                partner.client_state = ClientStates.auto_closed
                # dd.logger.info(
                #     "%s : invalid PAR->Stand %s", row, row.stand)

        if isinstance(partner, Client):
            v = row.idnat
            if v:
                try:
                    obj = Country.objects.get(isocode=v)
                except Country.DoesNotExist:
                    obj = create(Country, name=v, isocode=v)
                    yield obj
                    dd.logger.info("Inserted new country %s ", v)
                    return
                partner.nationality = obj

        yield partner

        partner.propagate_contact_details()

        if isinstance(partner, Partner):
            if row.zahler.strip():
                v = self.get_partner(Partner, row.zahler)
                if v:
                    yield SalesRule(partner=partner, invoice_recipient=v)
                else:
                    dd.logger.info(
                        "Could not import zahler %s", row.zahler)

        if isinstance(partner, Client):
            v = self.get_partner(Company, row.kkasse)
            if v:
                cct = rt.models.clients.ClientContactType.objects.get(pk=1)
                yield rt.models.clients.ClientContact(
                    type=cct, client=partner, company=v)

            v = self.get_partner(Person, row.hausarzt)
            if v:
                cct = rt.models.clients.ClientContactType.objects.get(pk=2)
                yield rt.models.clients.ClientContact(
                    type=cct, client=partner, contact_person=v)

        if prt == "G":
            if not isinstance(partner, Household):
                msg = "Partner of life group {} is not a household!?"
                dd.logger.warning(msg.format(pk))
            kw = dict(
                name=name, line=self.life_groups, id=partner.id,
                partner_id=partner.id)
            kw.update(ref=ref)
            for user in self.get_users(row):
                kw.update(teacher=user)
                break
            yield Course(**kw)
        
        if prt == "P":
            # if Course.objects.filter(id=obj.id).exists():
            #     return
            # if Course.objects.filter(ref=row.idpar.strip()).exists():
            #     return
            kw = dict(
                line=self.therapies,
                partner_id=partner.id,
                name=name, id=partner.id,
                ref=ref)
            for user in self.get_users(row):
                kw.update(teacher=user)
                break
            therapy = Course(**kw)
            yield therapy
            kw = dict()
            if row.date1:
                kw.update(start_date=row.date1)
                if row.date2 and row.date2 > row.date1:
                    # avoid "Date period ends before it started."
                    kw.update(end_date=row.date2)
            kw.update(
                state=EnrolmentStates.get_by_value(row.stand) \
                or EnrolmentStates.confirmed)
            yield Enrolment(pupil=partner, course=therapy, **kw)
            dd.logger.info("Created enrolment for therapy %s", partner)
Ejemplo n.º 22
0
    def test01(self):
        from lino.modlib.users.choicelists import UserTypes
        Ticket = rt.models.tickets.Ticket
        # Project = rt.models.tickets.Project
        # Line = rt.models.courses.Line
        # Activity = rt.models.courses.Course
        # Enrolment = rt.models.courses.Enrolment
        Meeting = rt.models.meetings.Meeting
        Change = rt.models.changes.Change
        User = rt.models.users.User
        Vote = rt.models.votes.Vote
        VoteStates = rt.models.votes.VoteStates
        VotesByVotable = rt.models.votes.VotesByVotable
        # ContentType = rt.models.contenttypes.ContentType
        # ct_Ticket = ContentType.objects.get_for_model(Ticket)

        # create(Project, name='project')

        robin = create(User, username='******',
                       first_name="Robin",
                       user_type=UserTypes.admin,
                       language="en")
        anna = create(User, username='******',
                      first_name="Anna",
                      user_type=UserTypes.user,
                      language="en")
        berta = create(User, username='******',
                       first_name="Berta",
                       user_type=UserTypes.user,
                       language="en")
        meeting = create(Meeting, name="Test")
        # sprints = create(Line, name="Sprints")
        # sprint = create(Activity, line=sprints)
        #
        # Enrolment(course=sprint, pupil=robin)
        
        ses = rt.login('robin')
        
        ticket = create(Ticket, summary="First", user=robin)
        ticket.after_ui_save(ses, None)
        vote = Vote.objects.get(votable=ticket)
        self.assertEqual(vote.user, robin)
        self.assertEqual(vote.state, VoteStates.author)
        
        def check_success(ia, **kwargs):
            rv = ia.run_from_session(ses, **kwargs)
            self.assertEqual(rv, {'success': True, 'refresh': True})

        check_success(ticket.mark_talk)
        check_success(ticket.mark_started)
        check_success(ticket.mark_refused)
        check_success(ticket.mark_closed)
        check_success(ticket.mark_refused)
        
        Vote.objects.all().delete()
        Ticket.objects.all().delete()
        
        self.assertEqual(Vote.objects.count(), 0)

        ticket = create(
            Ticket, summary="Second", user=robin, end_user=anna)
        ticket.after_ui_save(ses, None)
        self.assertEqual(Vote.objects.count(), 2)
        
        vote = Vote.objects.get(votable=ticket, user=anna)
        self.assertEqual(vote.state, VoteStates.author)

        
        # manually creating a vote will make the vote invited:
        vote = create(
            Vote, votable=ticket, user=berta)
        # vote.after_ui_save(ses, None)
        self.assertEqual(vote.state, VoteStates.invited)
Ejemplo n.º 23
0
 def createit():
     return create(Ticket, summary="Test", user=robin)
Ejemplo n.º 24
0
 def ENR(p, start_date, **kwargs):
     return create(
         Enrolment, course=obj, pupil=p,
         state=EnrolmentStates.confirmed,
         start_date=start_date, **kwargs)
Ejemplo n.º 25
0
    def unused_load_dls(self, row, **kw):
        if not row.iddls.strip():
            return
        # if not row.idpin.strip():
        #     return
        pk = row.iddls.strip()
        idusr = row.idusr.strip()
        if pk.startswith('E'):
            team = self.eupen
            pk = int(pk[1:])
        elif pk.startswith('S'):
            team = self.stvith
            pk = int(pk[1:]) + 1000000

        if pk in self.imported_sessions:
            dd.logger.warning("Cannot import duplicate session %s", pk)
            return
        self.imported_sessions.add(pk)
        u = self.get_user(idusr)
        if u is None:
            dd.logger.warning(
                "Cannot import session %s because there is no user %s", pk,
                idusr)
            return

        if u.team != team:
            u1 = u
            idusr += '@' + str(team.pk)
            try:
                u = User.objects.get(username=idusr)
            except User.DoesNotExist:
                u = create(User,
                           username=idusr,
                           first_name=u1.first_name,
                           team=team,
                           user_type=u1.user_type)

        kw.update(user=u)
        kw.update(id=pk)
        # if row.idprj.strip():
        #     kw.update(project_id=int(row.idprj))
        # kw.update(partner_id=PRJPAR.get(int(row.idprj),None))
        if row.idpar.strip():
            idpar = self.par_pk(row.idpar.strip())
            try:
                ticket = Partner.objects.get(id=idpar)
                kw.update(ticket=ticket)
            except Partner.DoesNotExist:
                dd.logger.warning(
                    "Cannot import session %s because there is no partner %d",
                    pk, idpar)
                return

        kw.update(summary=row.nb.strip())
        kw.update(start_date=row.date)

        def set_time(kw, fldname, v):
            v = v.strip()
            if not v:
                return
            if v == '24:00':
                v = '0:00'
            kw[fldname] = v

        set_time(kw, 'start_time', row.von)
        set_time(kw, 'end_time', row.bis)
        # set_time(kw, 'break_time', row.pause)
        # kw.update(start_time=row.von.strip())
        # kw.update(end_time=row.bis.strip())
        # kw.update(break_time=row.pause.strip())
        # kw.update(is_private=tim2bool(row.isprivat))
        obj = working.Session(**kw)
        # if row.idpar.strip():
        # partner_id = self.par_pk(row.idpar)
        # if obj.project and obj.project.partner \
        # and obj.project.partner.id == partner_id:
        # pass
        # elif obj.ticket and obj.ticket.partner \
        # and obj.ticket.partner.id == partner_id:
        # pass
        # else:
        # ~ dblogger.warning("Lost DLS->IdPar of DLS#%d" % pk)
        yield obj