def get_rst(self): user_type = UserTypes.get_by_value('900') with translation.override(self.language): #~ set_language(lng) actor_names = ' '.join(self.content).split() items = [] for an in actor_names: cls = settings.SITE.models.resolve(an) if not isinstance(cls, type): raise Exception("%s is not an actor." % self.content[0]) desc = "**{0}** (:class:`{1} <{2}>`)".format( force_text(cls.label), cls.__name__, cls.__module__ + '.' + cls.__name__ ) mi = user_type.find_menu_item(cls.default_action) if mi is not None: desc += _(" (Menu %s)") % menuselection(mi) #~ print(str(mi.label).strip()) if cls.help_text: desc += " : " + force_text(cls.help_text).strip() # items.append("%s : %s" % (actor_ref(cls), cls.help_text or '')) items.append(desc) return rstgen.ul(items)
def instance(cls): if cls._instance is None: # Call startup() to fill UserTypes also in a # multi-threaded environment: settings.SITE.startup() cls._instance = AnonymousUser() from lino.modlib.users.choicelists import UserTypes cls._instance.profile = UserTypes.get_by_value( settings.SITE.anonymous_user_type, None) if cls._instance.profile is None: raise Exception( "Invalid value %r for `SITE.anonymous_user_type`. " "Must be one of %s" % ( settings.SITE.anonymous_user_type, [i.value for i in list(UserTypes.items())])) return cls._instance
def get_user_profiles(cls): """Yield a series of all user profiles on this site which satisfy this role. """ from lino.modlib.users.choicelists import UserTypes for p in UserTypes.items(): if p.has_required_roles([cls]): yield p
def menupath_role(typ, rawtext, text, *args, **kwargs): a = resolve_action(text) user_type = UserTypes.get_by_value('900') mi = user_type.find_menu_item(a) if mi is None: raise Exception("Unknown menu descriptor %s" % text) text = menuselection_text(mi) rawtext = menuselection(mi) return menusel_role('menuselection', rawtext, text, *args, **kwargs)
def objects(): from lino_welfare.modlib.newcomers.models import Broker, Faculty, Competence pcsw = dd.resolve_app('pcsw') Person = dd.resolve_model('contacts.Person') I = Instantiator(Broker).build #~ yield I(**babel_values('name', #~ de=u"Polizei", fr=u"Police",en=u"Police")) #~ yield I(**babel_values('name', #~ de=u"Jugendgericht", fr=u"Jugendgericht",en=u"Jugendgericht")) yield I(name="Police") yield I(name="Other PCSW") I = Instantiator(Faculty).build yield I(weight=10, **babel_values('name', de=u"Eingliederungseinkommen (EiEi)", fr=u"Revenu d'intégration sociale (RIS)", en=u"EiEi")) yield I(weight=5, **babel_values('name', de=u"DSBE", fr=u"Service d'insertion socio-professionnelle", en=u"DSBE")) yield I(weight=4, **babel_values('name', de=u"Ausländerbeihilfe", fr=u"Aide sociale équivalente (pour étrangers)", en=u"Ausländerbeihilfe")) yield I(weight=6, **babel_values('name', de=u"Finanzielle Begleitung", fr=u"Accompagnement budgétaire", en=u"Finanzielle Begleitung")) yield I(weight=2, **babel_values('name', de=u"Laufende Beihilfe", fr=u"Aide complémenataire", en=u"Laufende Beihilfe")) #~ User = resolve_model('users.User') #~ yield User(username="******", #~ first_name="Caroline",last_name="Carnol", # ~ profile='200') # UserTypes.caroline) #~ FACULTIES = Cycler(Faculty.objects.all()) #~ profiles = [p for p in UserTypes.items() if p.integ_level] #~ USERS = Cycler(User.objects.filter(profile__in=profiles)) #~ for i in range(7): #~ yield Competence(user=USERS.pop(),faculty=FACULTIES.pop()) #~ for p in pcsw.Client.objects.filter(client_state=pcsw.ClientStates.new): #~ p.faculty = FACULTIES.pop() #~ p.save() newcomers = dd.resolve_app('newcomers') users = dd.resolve_app('users') QUOTAS = Cycler(100, 60, 50, 20) FACULTIES = Cycler(newcomers.Faculty.objects.all()) profiles = [ p for p in UserTypes.items() if isinstance(p.role, IntegrationAgent) and not isinstance(p.role, dd.SiteStaff)] qs = users.User.objects.filter(profile__in=profiles) for u in qs: u.newcomer_quota = QUOTAS.pop() yield u USERS = Cycler(qs) for i in range(7): yield newcomers.Competence(user=USERS.pop(), faculty=FACULTIES.pop()) for p in pcsw.Client.objects.exclude( client_state=pcsw.ClientStates.former): p.faculty = FACULTIES.pop() p.save()
def show_complexity_factors(self): self.analyze() items = [] items.append("{0} plugins".format(len(dd.plugins))) items.append("{0} models".format(len(get_models()))) items.append("{0} views".format(len(actors.actors_list))) items.append("{0} user types".format(len(UserTypes.objects()))) dialog_actions = [ ba for ba in analyzer.custom_actions + analyzer.window_actions if ba.action.parameters ] items.append("{0} dialog actions".format(len(dialog_actions))) return rstgen.ul(items)
def save(self, *args, **kwargs): super(Room, self). save(*args, **kwargs) if not self.calendar: return if not settings.SITE.loading_from_dump: user_types = set() for p in UserTypes.items(): if p.has_required_roles([OfficeUser]): user_types.add(p) User = settings.SITE.user_model for u in User.objects.filter(user_type__in=user_types): check_subscription(u, self.calendar)
def get_complexity_factors(self, today=None): self.analyze() yield "{0} plugins".format(len(dd.plugins)) yield "{0} models".format(len(get_models())) User = settings.SITE.user_model if today and User: qs = User.objects.filter(username__isnull=False) qs = PeriodEvents.active.add_filter(qs, today) yield "{0} users".format(qs.count()) yield "{0} user roles".format(len(settings.SITE.user_roles)) yield "{0} user types".format(len(UserTypes.objects())) yield "{0} views".format(len( [a for a in actors.actors_list if not a.abstract])) dialog_actions = [ba for ba in analyzer.custom_actions + analyzer.window_actions if ba.action.parameters] yield "{0} dialog actions".format(len(dialog_actions))
def instance(cls): if cls._instance is None: # Call startup() to fill UserTypes also in a # multi-threaded environment: settings.SITE.startup() cls._instance = AnonymousUser() from lino.modlib.users.choicelists import UserTypes cls._instance.profile = UserTypes.get_by_name('anonymous', None) # cls._instance.profile = UserTypes.get_by_value( # settings.SITE.anonymous_user_type, None) # if cls._instance.profile is None: # raise Exception( # "Invalid value %r for `SITE.anonymous_user_type`. " # "Must be one of %s" % ( # settings.SITE.anonymous_user_type, # [i.value for i in list(UserTypes.items())])) return cls._instance
def actors_overview_ul(model_reports): user_type = UserTypes.get_by_value('900') # deprecated items = [] for tb in model_reports: desc = actor_ref(tb) #~ label = str(tb.title or tb.label) #~ desc += " (%s)" % str(tb) desc += " (%s)" % typeref(tb) # mi = find_menu_item(tb.default_action) mi = user_type.find_menu_item(tb.default_action) if mi is not None: desc += _(" (Menu %s)") % menuselection(mi) #~ print(unicode(mi.label).strip()) if tb.help_text: desc += " -- " + str(tb.help_text).strip() items.append(desc) return rstgen.ul(items)
def visible_for(ba): """Shows a list of user profiles for which this action is visible.""" if ba is None: return "N/A" visible = [] hidden = [] for p in UserTypes.objects(): name = p.name or p.value if ba.get_view_permission(p): visible.append(name) else: hidden.append(name) if len(hidden) == 0: return "all" if len(visible) == 0: return "nobody" # if len(hidden) < len(visible): # if len(hidden) <= 3: # return "all except %s" % ', '.join(hidden) return ' '.join(visible)
def build_site_cache(self, force=False): """ Build the site cache files under `/media/cache`, especially the :xfile:`lino*.js` files, one per user user_type and language. """ # if not self.is_prepared: # self.prepare_layouts() # self.is_prepared = True if settings.SITE.never_build_site_cache: logger.debug( "Not building site cache because `settings.SITE.never_build_site_cache` is True" ) return if not os.path.isdir(settings.MEDIA_ROOT): logger.debug( "Not building site cache because " + "directory '%s' (settings.MEDIA_ROOT) does not exist.", settings.STATIC_ROOT) return started = time.time() # logger.info("20140401 build_site_cache started") settings.SITE.on_each_app('setup_site_cache', force) settings.SITE.makedirs_if_missing( os.path.join(settings.MEDIA_ROOT, 'upload')) settings.SITE.makedirs_if_missing( os.path.join(settings.MEDIA_ROOT, 'webdav')) if force or settings.SITE.build_js_cache_on_startup: count = 0 for lng in settings.SITE.languages: with translation.override(lng.django_code): for user_type in UserTypes.objects(): count += with_user_profile(user_type, self.build_js_cache, force) logger.info("%d lino*.js files have been built in %s seconds.", count, time.time() - started)
def build_site_cache(self, force=False): """ Build the site cache files under `/media/cache`, especially the :xfile:`lino*.js` files, one per user user_type and language. """ # if not self.is_prepared: # self.prepare_layouts() # self.is_prepared = True if settings.SITE.never_build_site_cache: logger.debug( "Not building site cache because `settings.SITE.never_build_site_cache` is True") return if not os.path.isdir(settings.MEDIA_ROOT): logger.debug( "Not building site cache because " + "directory '%s' (settings.MEDIA_ROOT) does not exist.", settings.STATIC_ROOT) return started = time.time() # logger.info("20140401 build_site_cache started") settings.SITE.on_each_app('setup_site_cache', force) settings.SITE.makedirs_if_missing( os.path.join(settings.MEDIA_ROOT, 'upload')) settings.SITE.makedirs_if_missing( os.path.join(settings.MEDIA_ROOT, 'webdav')) if force or settings.SITE.build_js_cache_on_startup: count = 0 for lng in settings.SITE.languages: with translation.override(lng.django_code): for user_type in UserTypes.objects(): count += with_user_profile( user_type, self.build_js_cache, force) logger.info("%d lino*.js files have been built in %s seconds.", count, time.time() - started)
def get_complexity_factors(self, today=None): """ Yield a series of plain text lines that describe the complexity factors of this application. """ self.analyze() yield "{0} plugins".format(len(dd.plugins)) yield "{0} models".format(len(get_models())) User = settings.SITE.user_model if today and User: qs = User.objects.filter(username__isnull=False) qs = PeriodEvents.active.add_filter(qs, today) yield "{0} users".format(qs.count()) # yield "{0} user roles".format(len(settings.SITE.user_roles)) yield "{0} user types".format(len(UserTypes.objects())) yield "{0} views".format( len([a for a in actors.actors_list if not a.abstract])) dialog_actions = [ ba for ba in analyzer.custom_actions + analyzer.window_actions if ba.action.parameters and not ba.action.no_params_window ] yield "{0} dialog actions".format(len(dialog_actions))
def get_request_queryset(self, ar): profiles = [p for p in UserTypes.items() if isinstance(p.role, SocialAgent)] return super(AvailableCoaches, self, ar).filter( models.Q(profile__in=profiles))
def __init__(self): settings.SITE.startup() from lino.modlib.users.choicelists import UserTypes self.user_type = UserTypes.get_by_name(self.username, None)
class Secretary(Receptor, SiteStaff, ContactsStaff, ExcerptsUser, VoucherSupervisor, ProductsStaff, Explorer, GuestOperator): pass class Teacher(CoursesTeacher): # , ExcerptsUser, OfficeUser): """Somebody who can just register presences of participants, i.e. mark them as absent or present. """ pass class SiteAdmin(SiteAdmin, CoursesUser, ContactsStaff, OfficeStaff, NotesStaff, LedgerStaff, SepaStaff, CheckdataUser, GuestOperator, ExcerptsStaff, ProductsStaff, Explorer, SiteSearcher): pass from django.utils.translation import ugettext_lazy as _ from lino.modlib.users.choicelists import UserTypes UserTypes.clear() add = UserTypes.add_item add('000', _("Anonymous"), UserRole, name='anonymous', readonly=True) add('100', _("User"), Receptor, name='user') add('200', _("Secretary"), Secretary, name='secretary') add('300', _("Teacher"), Teacher, name='teacher') add('900', _("Administrator"), SiteAdmin, name='admin')
dd.connection_created.connect(my_handler) if AFTER18: models.signals.post_migrate.connect(my_handler) else: models.signals.post_syncdb.connect(my_handler) class SiteConfigs(dd.Table): """ The table used to present the :class:`SiteConfig` row in a Detail form. See also :meth:`lino.Lino.get_site_config`. Deserves more documentation. """ model = 'system.SiteConfig' required_roles = dd.required(SiteStaff) default_action = actions.ShowDetail() #~ has_navigator = False hide_top_toolbar = True #~ can_delete = perms.never detail_layout = """ default_build_method # lino.ModelsBySite """ do_build = BuildSiteCache() if settings.SITE.user_model == 'auth.User': dd.inject_field(settings.SITE.user_model, 'profile', UserTypes.field()) dd.inject_field(settings.SITE.user_model, 'language', dd.LanguageField())
#~ def setup_handle(self,lh): #~ lh.config.label = _("Site Parameters") #~ lh.about.label = _("About") class SiteConfigs(dd.Table): """ The table used to present the :class:`SiteConfig` row in a Detail form. See also :meth:`lino.Lino.get_site_config`. Deserves more documentation. """ model = 'system.SiteConfig' required_roles = dd.required(SiteStaff) default_action = actions.ShowDetailAction() #~ has_navigator = False hide_top_toolbar = True #~ can_delete = perms.never detail_layout = """ default_build_method # lino.ModelsBySite """ do_build = BuildSiteCache() if settings.SITE.user_model == 'auth.User': dd.inject_field(settings.SITE.user_model, 'profile', UserTypes.field()) dd.inject_field(settings.SITE.user_model, 'language', dd.LanguageField())
Currently an office operator can create their own notes and uploads, but no calendar entries. For example the `lino_xl.lib.cal.ui.OverdueAppointments` table requires :class:`OfficeStaff` and is *not* available for :class:`OfficeOperator`. """ # class OfficeStaff(OfficeUser, OfficeOperator, ContactsStaff): class OfficeStaff(OfficeUser, OfficeOperator): """A user who manages configuration of office functionality. """ class SiteAdmin(SiteAdmin, OfficeStaff): """A user with all permissions.""" pass from django.utils.translation import ugettext_lazy as _ from lino.modlib.users.choicelists import UserTypes UserTypes.clear() add = UserTypes.add_item add('000', _("Anonymous"), UserRole, name='anonymous', readonly=True) add('100', _("User"), OfficeUser, name='user') add('900', _("Administrator"), SiteAdmin, name='admin')