コード例 #1
0
ファイル: models.py プロジェクト: ManuelWeidmann/lino
 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)
コード例 #2
0
ファイル: models.py プロジェクト: raffas/lino
 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)
コード例 #3
0
ファイル: kernel.py プロジェクト: MaxTyutyunnikov/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()
コード例 #4
0
ファイル: models_event.py プロジェクト: ManuelWeidmann/lino
 def on_analyze(cls, lino):
     cls.DISABLED_AUTO_FIELDS = dd.fields_list(cls,
         '''summary''')
コード例 #5
0
ファイル: models_task.py プロジェクト: cuchac/lino
 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)
コード例 #6
0
ファイル: kernel.py プロジェクト: ManuelWeidmann/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()
コード例 #7
0
ファイル: mixins.py プロジェクト: raffas/lino
 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)
コード例 #8
0
ファイル: models.py プロジェクト: raffas/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)
コード例 #9
0
ファイル: mixins.py プロジェクト: raffas/lino
 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)
コード例 #10
0
ファイル: models.py プロジェクト: ManuelWeidmann/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 = (
コード例 #11
0
ファイル: models.py プロジェクト: MaxTyutyunnikov/lino
        #~ 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):
    """