def on_analyze(cls, site): cls.PRINTABLE_FIELDS = dd.fields_list( cls, 'project excerpt_type \ body_template_content \ user build_method') super(Excerpt, cls).on_analyze(site)
def on_analyze(cls, lino): cls.PRINTABLE_FIELDS = dd.fields_list( cls, "project company contact_person contact_role \ excerpt_type language \ user build_method", ) super(Excerpt, cls).on_analyze(lino)
def startup_site(self): """ This is the code that runs when you call :meth:`lino.site.Site.startup`. This is a part of a Lino site setup. The Django Model definitions are done, now Lino analyzes them and does certain actions. - Verify that there are no more pending injects - Install a DisableDeleteHandler for each Model into `_lino_ddh` - Install :class:`lino.dd.Model` attributes and methods into Models that don't inherit from it. """ if len(sys.argv) == 0: process_name = 'WSGI' else: process_name = ' '.join(sys.argv) #~ logger.info("Started %s on %r (PID %s).", process_name,self.title,os.getpid()) logger.info("Started %s (using %s) --> PID %s", process_name,settings.SETTINGS_MODULE,os.getpid()) logger.info(self.welcome_text()) def goodbye(): logger.info("Done %s (PID %s)",process_name,os.getpid()) atexit.register(goodbye) #~ analyze_models(self) #~ print 20130219, __file__, "setup_choicelists 1" #~ logger.info("Analyzing models...") #~ self = settings.SITE #~ logger.info(self.welcome_text()) #~ """ #~ Activate the site's default language #~ """ #~ dd.set_language(None) #~ logger.info(lino.welcome_text()) #~ raise Exception("20111229") models_list = models.get_models(include_auto_created=True) # this also triggers django.db.models.loading.cache._populate() if self.user_model: self.user_model = dd.resolve_model(self.user_model, strict="Unresolved model '%s' in user_model.") #~ if self.person_model: #~ self.person_model = dd.resolve_model(self.person_model,strict="Unresolved model '%s' in person_model.") #~ print 20130219, __file__, "setup_choicelists 2" if self.project_model: self.project_model = dd.resolve_model(self.project_model, strict="Unresolved model '%s' in project_model.") #~ print 20130219, __file__, "setup_choicelists 3" for m in self.override_modlib_models: dd.resolve_model(m, strict="Unresolved model '%s' in override_modlib_models.") for model in models_list: #~ print 20130216, model #~ fix_field_cache(model) model._lino_ddh = DisableDeleteHandler(model) for k in dd.Model.LINO_MODEL_ATTRIBS: if not hasattr(model,k): #~ setattr(model,k,getattr(dd.Model,k)) setattr(model,k,dd.Model.__dict__[k]) #~ model.__dict__[k] = getattr(dd.Model,k) #~ logger.info("20121127 Install default %s for %s",k,model) if isinstance(model.hidden_columns,basestring): model.hidden_columns = frozenset(dd.fields_list(model,model.hidden_columns)) if model._meta.abstract: raise Exception("Tiens?") self.modules.define(model._meta.app_label,model.__name__,model) for f in model._meta.virtual_fields: if isinstance(f,generic.GenericForeignKey): settings.SITE.GFK_LIST.append(f) for a in models.get_apps(): #~ for app_label,a in loading.cache.app_store.items(): app_label = a.__name__.split('.')[-2] #~ logger.info("Installing %s = %s" ,app_label,a) for k,v in a.__dict__.items(): if isinstance(v,type) and issubclass(v,layouts.BaseLayout): #~ print "%s.%s = %r" % (app_label,k,v) self.modules.define(app_label,k,v) #~ if isinstance(v,type) and issubclass(v,dd.Plugin): #~ self.plugins.append(v) #~ if isinstance(v,type) and issubclass(v,dd.Module): #~ logger.info("20120128 Found module %s",v) if k.startswith('setup_'): self.modules.define(app_label,k,v) self.setup_choicelists() self.setup_workflows() for model in models_list: for f, m in model._meta.get_fields_with_model(): #~ if isinstance(f,models.CharField) and f.null: if f.__class__ is models.CharField and f.null: msg = "Nullable CharField %s in %s" % (f.name,model) raise Exception(msg) #~ if f.__class__ is models.CharField: #~ raise Exception(msg) #~ else: #~ logger.info(msg) elif isinstance(f,models.ForeignKey): #~ f.rel.to = dd.resolve_model(f.rel.to,strict=True) if isinstance(f.rel.to,basestring): raise Exception("%s %s relates to %r (models are %s)" % (model,f.name,f.rel.to,models_list)) set_default_verbose_name(f) """ If JobProvider is an MTI child of Company, then mti.delete_child(JobProvider) must not fail on a JobProvider being refered only by objects that can refer to a Company as well. """ if hasattr(f.rel.to,'_lino_ddh'): #~ f.rel.to._lino_ddh.add_fk(model,f) # 20120728 f.rel.to._lino_ddh.add_fk(m or model,f) dd.pre_analyze.send(self,models_list=models_list) # MergeActions are defined in pre_analyze. # And MergeAction needs the info in _lino_ddh to correctly find keep_volatiles for model in models_list: """ Virtual fields declared on the model must have been attached before calling Model.site_setup(), e.g. because pcsw.Person.site_setup() declares `is_client` as imported field. """ model.on_analyze(self) for k,v in class_dict_items(model): if isinstance(v,dd.VirtualField): v.attach_to_model(model,k) #~ logger.info("20130817 attached model vfs") actors.discover() actors.initialize() dbtables.discover() #~ choosers.discover() actions.discover_choosers() #~ from lino.core import ui #~ ui.site_setup(self) for a in actors.actors_list: a.on_analyze(self) #~ logger.info("20130121 GFK_LIST is %s",['%s.%s'%(full_model_name(f.model),f.name) for f in settings.SITE.GFK_LIST]) dd.post_analyze.send(self,models_list=models_list) logger.info("Languages: %s. %d apps, %d models, %s actors.", ', '.join([li.django_code for li in self.languages]), len(self.modules), len(models_list), len(actors.actors_list)) #~ logger.info(settings.INSTALLED_APPS) self.on_each_app('site_setup') """ Actor.after_site_setup() is called after the apps' site_setup(). Example: pcsw.site_setup() adds a detail to properties.Properties, the base class for properties.PropsByGroup. The latter would not install a `detail_action` during her after_site_setup() and also would never get it later. """ for a in actors.actors_list: a.after_site_setup(self) #~ self.on_site_startup() self.resolve_virtual_fields()
def on_analyze(cls, lino): cls.DISABLED_AUTO_FIELDS = dd.fields_list(cls, '''summary''')
def on_analyze(cls, lino): #~ lino.TASK_AUTO_FIELDS = dd.fields_list(cls, cls.DISABLED_AUTO_FIELDS = dd.fields_list(cls, '''start_date start_time summary''') super(Task, cls).on_analyze(lino)
def kernel_startup(kernel, self): """This is a part of a Lino site setup. The Django Model definitions are done, now Lino analyzes them and does certain actions: - Verify that there are no more pending injects - Install a DisableDeleteHandler for each Model into `_lino_ddh` - Install :class:`lino.dd.Model` attributes and methods into Models that don't inherit from it. """ if len(sys.argv) == 0: process_name = 'WSGI' else: process_name = ' '.join(sys.argv) #~ logger.info("Started %s on %r (PID %s).", process_name,self.title,os.getpid()) logger.info("Started %s (using %s) --> PID %s", process_name, settings.SETTINGS_MODULE, os.getpid()) logger.info(self.welcome_text()) def goodbye(): logger.info("Done %s (PID %s)", process_name, os.getpid()) atexit.register(goodbye) models_list = models.get_models(include_auto_created=True) # this also triggers django.db.models.loading.cache._populate() if self.user_model: self.user_model = dd.resolve_model(self.user_model, strict="Unresolved model '%s' in user_model.") if self.project_model: self.project_model = dd.resolve_model( self.project_model, strict="Unresolved model '%s' in project_model.") for app_name_model, p in self.override_modlib_models.items(): # app_name_model is the full installed app module name + # the model name. It certainly contains at least one dot. m = '.'.join(app_name_model.split('.')[-2:]) dd.resolve_model( m, strict="%s plugin tries to extend unresolved model '%%s'" % p.__class__.__module__) for model in models_list: #~ print 20130216, model #~ fix_field_cache(model) model._lino_ddh = DisableDeleteHandler(model) dd.Model.django2lino(model) if isinstance(model.hidden_columns, basestring): model.hidden_columns = frozenset( dd.fields_list(model, model.hidden_columns)) if isinstance(model.active_fields, basestring): model.active_fields = frozenset( dd.fields_list(model, model.active_fields)) if isinstance(model.allow_cascaded_delete, basestring): model.allow_cascaded_delete = tuple( dd.fields_list(model, model.allow_cascaded_delete)) if model._meta.abstract: raise Exception("Tiens?") # self.modules.define(model._meta.app_label, model.__name__, model) for f in model._meta.virtual_fields: if isinstance(f, generic.GenericForeignKey): settings.SITE.GFK_LIST.append(f) # vip_classes = (layouts.BaseLayout, fields.Dummy) # for a in models.get_apps(): # app_label = a.__name__.split('.')[-2] # for k, v in a.__dict__.items(): # if isinstance(v, type) and issubclass(v, vip_classes): # self.modules.define(app_label, k, v) # if k.startswith('setup_'): # self.modules.define(app_label, k, v) self.setup_choicelists() self.setup_workflows() for model in models_list: for f, m in model._meta.get_fields_with_model(): # Refuse nullable CharFields, but don't trigger on # NullableCharField (which is a subclass of CharField). if f.__class__ is models.CharField and f.null: msg = "Nullable CharField %s in %s" % (f.name, model) raise Exception(msg) #~ if f.__class__ is models.CharField: #~ raise Exception(msg) #~ else: #~ logger.info(msg) elif isinstance(f, models.ForeignKey): #~ f.rel.to = dd.resolve_model(f.rel.to,strict=True) if isinstance(f.rel.to, basestring): raise Exception("%s %s relates to %r (models are %s)" % (model, f.name, f.rel.to, models_list)) set_default_verbose_name(f) """ If JobProvider is an MTI child of Company, then mti.delete_child(JobProvider) must not fail on a JobProvider being refered only by objects that can refer to a Company as well. """ if hasattr(f.rel.to, '_lino_ddh'): f.rel.to._lino_ddh.add_fk(m or model, f) for p in self.installed_plugins: if isinstance(p, LinoPlugin): p.before_analyze(self) dd.pre_analyze.send(self, models_list=models_list) # MergeActions are defined in pre_analyze. # And MergeAction needs the info in _lino_ddh to correctly find # keep_volatiles for model in models_list: """ Virtual fields declared on the model must have been attached before calling Model.site_setup(), e.g. because pcsw.Person.site_setup() declares `is_client` as imported field. """ model.on_analyze(self) for k, v in class_dict_items(model): if isinstance(v, dd.VirtualField): v.attach_to_model(model, k) #~ logger.info("20130817 attached model vfs") actors.discover() logger.debug("actors.initialize()") for a in actors.actors_list: a.class_init() dbtables.discover() #~ choosers.discover() actions.discover_choosers() #~ from lino.core import ui #~ ui.site_setup(self) for a in actors.actors_list: a.on_analyze(self) #~ logger.info("20130121 GFK_LIST is %s",['%s.%s'%(full_model_name(f.model),f.name) for f in settings.SITE.GFK_LIST]) dd.post_analyze.send(self, models_list=models_list) logger.info("Languages: %s. %d apps, %d models, %s actors.", ', '.join([li.django_code for li in self.languages]), len(self.modules), len(models_list), len(actors.actors_list)) #~ logger.info(settings.INSTALLED_APPS) self.on_each_app('site_setup') # Actor.after_site_setup() is called after the apps' # site_setup(). Example: pcsw.site_setup() adds a detail to # properties.Properties, the base class for # properties.PropsByGroup. The latter would not install a # `detail_action` during her after_site_setup() and also would # never get it later. for a in actors.actors_list: a.after_site_setup(self) #~ self.on_site_startup() self.resolve_virtual_fields()
def on_analyze(cls, lino): cls.WEEKDAY_FIELDS = dd.fields_list(cls, '''monday tuesday wednesday thursday friday saturday sunday ''') super(RecurrenceSet, cls).on_analyze(lino)
def after_ui_save(self, ar): super(Account, self).after_ui_save(ar) if self.primary: mi = self.partner for o in mi.sepa_accounts.exclude(id=self.id): if o.primary: o.primary = False o.save() ar.set_response(refresh_all=True) watcher = dd.ChangeWatcher(mi) for k in PRIMARY_FIELDS: setattr(mi, k, getattr(self, k)) mi.save() watcher.send_update(ar.request) PRIMARY_FIELDS = dd.fields_list(Account, 'iban bic') class Accounts(dd.Table): model = 'sepa.Account' class AccountsByPartner(Accounts): master_key = 'partner' column_names = 'iban bic remark' order_by = ['iban'] auto_fit_column_widths = True def setup_explorer_menu(site, ui, profile, m): m = m.add_menu(config.app_label, config.verbose_name)
def on_analyze(cls, lino): # Contract.user.verbose_name = _("responsible (DSBE)") cls.CERTIFIED_FIELDS = dd.fields_list(cls, cls.get_certifiable_fields()) super(Certifiable, cls).on_analyze(lino)
return if self.primary: for o in mi.addresses_by_partner.exclude(id=self.id): if o.primary: o.primary = False o.save() ar.set_response(refresh_all=True) mi.sync_primary_address(ar.request) def living_at_text(self): lines = list(self.address_location_lines()) return self.address_type.living_text + ' ' + ', '.join(lines) Address.ADDRESS_FIELDS = dd.fields_list( Address, 'street street_no street_box addr1 addr2 zip_code city region country') @dd.receiver(dd.pre_ui_delete, sender=Address) def clear_partner_on_delete(sender=None, request=None, **kw): self = sender mi = self.partner if mi: mi.sync_primary_address(request) class Addresses(dd.Table): model = 'addresses.Address' required = dd.required(user_level='admin') column_names = (
#~ logger.info("SalesDocument.full_clean") super(SalesDocument,self).full_clean(*args,**kw) r = get_sales_rule(self) if r is None: raise ValidationError("No sales rule for %s",self) #~ raise journals.DocumentError("No sales rule for %s",self) if self.imode is None: self.imode = r.imode if self.shipping_mode is None: self.shipping_mode = r.shipping_mode if self.shipping_mode is None: self.shipping_mode = r.shipping_mode self.update_total() SALES_PRINTABLE_FIELDS = dd.fields_list(SalesDocument, 'customer imode payment_term ' 'creation_date your_ref subject ' 'language vat_exempt item_vat ') class OrderManager(models.Manager): def pending(self,make_until=None): l = [] for o in self.all(): if o.make_invoice(make_until=make_until,simulate=True): l.append(o) return l class Order(SalesDocument): """