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)
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)
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')
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)
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')
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)
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, "*****@*****.**")
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
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ès moi le dé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)
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
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
def createit(): return create(Ticket, summary="Test", user=robin)
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)
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)
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')
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
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
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)
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)
def ENR(p, start_date, **kwargs): return create( Enrolment, course=obj, pupil=p, state=EnrolmentStates.confirmed, start_date=start_date, **kwargs)
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