Esempio n. 1
0
 def get_cancelinvoices(cls, instance, valid=False):
     from autonomie.models.task import CancelInvoice
     query = DBSESSION().query(CancelInvoice)
     query = query.filter(CancelInvoice.company_id == instance.id)
     if valid:
         query = query.filter(
             CancelInvoice.CAEStatus.in_(CancelInvoice.valid_states))
     return query
Esempio n. 2
0
    def get_estimations(cls, instance, valid=False):
        from autonomie.models.task import Estimation
        query = DBSESSION().query(Estimation)
        query = query.filter(Estimation.company_id == instance.id)
        if valid:
            query = query.filter(
                Estimation.CAEStatus.in_(Estimation.valid_states))

        return query
Esempio n. 3
0
 def get_customers(cls, instance, year):
     from autonomie.models.task import Invoice
     from autonomie.models.customer import Customer
     query = DBSESSION().query(Customer)
     query = query.filter(Customer.company_id == instance.id)
     query = query.filter(
         Customer.invoices.any(
             and_(Invoice.CAEStatus.in_(Invoice.valid_states),
                  Invoice.financial_year == year)))
     return query
Esempio n. 4
0
    def get_tasks(cls, instance, type_str=None):
        from autonomie.models.task import Task
        query = DBSESSION().query(Task)
        query = query.filter_by(customer_id=instance.id)

        if type_str is not None:
            query = query.filter(Task.type_ == type_str)
        else:
            query = query.filter(
                Task.type_.in_(('invoice', 'cancelinvoice', 'estimation')))
        return query
Esempio n. 5
0
    def get_tasks(cls, instance, type_str=None):
        from autonomie.models.task import Task

        query = DBSESSION().query(Task)
        query = query.filter_by(project_id=instance.id)

        if type_str is not None:
            query = query.filter(Task.type_ == type_str)
        else:
            query = query.filter(Task.type_.in_(("invoice", "cancelinvoice", "estimation")))
        return query
Esempio n. 6
0
 def get_tasks(cls, instance, offset=None, limit=None):
     from autonomie.models.task import Task
     query = DBSESSION().query(Task)
     query = query.filter(Task.company_id == instance.id)
     query = query.filter(
         Task.type_.in_(('invoice', 'estimation', 'cancelinvoice')))
     query = query.order_by(desc(Task.statusDate))
     if offset is not None:
         query = query.offset(offset)
     if limit is not None:
         query = query.limit(limit)
     return query
Esempio n. 7
0
 def get_customer_codes_and_names(cls, company):
     """
     Return a query for code and names of customers related to company
     :param company: the company we're working on
     :returns: an orm query loading Customer instances with only the columns
     we want
     :rtype: A Sqlalchemy query object
     """
     from autonomie.models.customer import Customer
     query = DBSESSION().query(Customer)
     query = query.options(load_only('code', 'name'))
     query = query.filter(Customer.code != None)
     query = query.filter(Customer.company_id == company.id)
     return query.order_by(Customer.code)
Esempio n. 8
0
    def query(self):
        """
        Return the main query used to find objects

        e.g:

            query = DBSESSION().query(distinct(UserDatas.id), UserDatas)
            query = query.filter(UserDatas.name.startswith('test'))
            query = query.outerjoin(UserDatas.conseiller)
            query = query.filter(User.lastname=='A manager')
            query = query.filter(
                UserDatas.id.in_(
                    [list of ids retrieved from independant queries]
                )
            )

        """
        self.already_joined = []
        if self.root:
            main_query = DBSESSION().query(distinct(self.model.id), self.model)
        else:
            main_query = DBSESSION().query(distinct(self.model.id))

        # Pour chaque critère sur lesquels on va ajouter des filtres, on a
        # besoin d'être sûr que la classe concernée est bien requêtée, il faut
        # donc ajouter des outerjoins pour chaque classe liée.

        # NOTE: on ne gère pas les alias (les joins sur deux tables identiques
        # pour deux relations différentes)
        for criterion in self.query_helpers:
            # On génère le filtre
            filter_ = criterion.gen_filter()
            having = criterion.gen_having_clause()

            # si il y a un filtre ...
            if filter_ is not None:
                main_query = self.join(main_query, criterion)
                main_query = main_query.filter(filter_)

            elif having is not None:
                main_query = self.join(main_query, criterion)
                main_query = main_query.group_by(self.model.id)
                main_query = main_query.having(having)

        if self.query_factories:
            ids = list(self._get_ids_from_factories())
            main_query = main_query.filter(self.model.id.in_(ids))

        return main_query
Esempio n. 9
0
    def query(self):
        """
        Return the main query used to find objects

        e.g:

            query = DBSESSION().query(distinct(UserDatas.id), UserDatas)
            query = query.filter(UserDatas.name.startswith('test'))
            query = query.outerjoin(UserDatas.conseiller)
            query = query.filter(User.lastname=='A manager')
            query = query.filter(
                UserDatas.id.in_(
                    [list of ids retrieved from independant queries]
                )
            )

        """
        self.already_joined = []
        if self.root:
            main_query = DBSESSION().query(distinct(self.model.id), self.model)
        else:
            main_query = DBSESSION().query(distinct(self.model.id))

        # Pour chaque critère sur lesquels on va ajouter des filtres, on a
        # besoin d'être sûr que la classe concernée est bien requêtée, il faut
        # donc ajouter des outerjoins pour chaque classe liée.

        # NOTE: on ne gère pas les alias (les joins sur deux tables identiques
        # pour deux relations différentes)
        for criterion in self.query_helpers:
            # On génère le filtre
            filter_ = criterion.gen_filter()
            having = criterion.gen_having_clause()

            # si il y a un filtre ...
            if filter_ is not None:
                main_query = self.join(main_query, criterion)
                main_query = main_query.filter(filter_)

            elif having is not None:
                main_query = self.join(main_query, criterion)
                main_query = main_query.group_by(self.model.id)
                main_query = main_query.having(having)

        if self.query_factories:
            ids = list(self._get_ids_from_factories())
            main_query = main_query.filter(self.model.id.in_(ids))

        return main_query
Esempio n. 10
0
 def query(self):
     company = self.request.context
     # We can't have projects without having customers
     if not company.customers:
         redirect_to_customerslist(self.request, company)
     main_query = DBSESSION().query(distinct(Project.id), Project)
     main_query = main_query.outerjoin(Project.customers)
     return main_query.filter(Project.company_id == company.id)
Esempio n. 11
0
 def query(self):
     company = self.request.context
     # We can't have projects without having customers
     if not company.customers:
         redirect_to_customerslist(self.request, company)
     main_query = DBSESSION().query(distinct(Project.id), Project)
     main_query = main_query.outerjoin(Project.customers)
     return main_query.filter(Project.company_id == company.id)
Esempio n. 12
0
 def query(cls, keys=None, active=True):
     """
         Return a query
     """
     if keys:
         query = DBSESSION().query(*keys)
     else:
         query = super(Company, cls).query()
     if active:
         query = query.filter(cls.active == "Y")
     return query.order_by(cls.name)
Esempio n. 13
0
def get_next_official_number(year=None):
    """
    Return the next available official number

    :param int year: The year we'd like to query a number for
    """
    next_ = 1
    if year is None:
        year = datetime.date.today().year

    query = DBSESSION().query(func.max(Task.official_number))
    query = query.filter(extract('year', Task.date) == year)
    last = query.first()[0]
    if last:
        next_ = last + 1

    return next_
Esempio n. 14
0
    def _get_next_official_number(year=None):
        """
        Return the next available official number

        :param int year: The year we'd like to query a number for
        """
        next_ = 1
        if year is None:
            year = datetime.date.today().year

        query = DBSESSION().query(func.max(Task.official_number))
        query = query.filter(extract("year", Task.date) == year)
        last = query.first()[0]
        if last:
            next_ = last + 1

        return next_
Esempio n. 15
0
    def filter_notfilled(self, query, appstruct):
        """
        Filter the workshops for which timeslots have not been filled
        """
        notfilled = appstruct.get('notfilled')
        if notfilled:
            logger.debug(u"Filtering the workshop that where not filled")
            attendance_query = DBSESSION().query(distinct(Attendance.event_id))
            attendance_query = attendance_query.filter(
                Attendance.status != 'registered')

            timeslot_ids = [item[0] for item in attendance_query]

            query = query.filter(
                not_(
                    models.Workshop.timeslots.any(
                        models.Timeslot.id.in_(timeslot_ids))))
        return query
Esempio n. 16
0
    def filter_notfilled(self, query, appstruct):
        """
        Filter the workshops for which timeslots have not been filled
        """
        notfilled = appstruct.get('notfilled')
        if notfilled:
            logger.debug(u"Filtering the workshop that where not filled")
            attendance_query = DBSESSION().query(distinct(Attendance.event_id))
            attendance_query = attendance_query.filter(
                Attendance.status != 'registered'
            )

            timeslot_ids = [item[0] for item in attendance_query]

            query = query.filter(
                not_(
                    models.Workshop.timeslots.any(
                        models.Timeslot.id.in_(timeslot_ids)
                    )
                )
            )
        return query
Esempio n. 17
0
    def query(self):
        """
        Returns the main query used to find objects

        E.G:

            query = DBSESSION().query(distinct(UserDatas.id), UserDatas)
            query = query.filter(UserDatas.name.startswith('test'))
            query = query.outerjoin(UserDatas.conseiller)
            query = query.filter(User.lastname=='A manager')
        """
        query = DBSESSION().query(distinct(self.model.id), self.model)

        # Pour chaque critère sur lesquels on va ajouter des filtres, on a
        # besoin d'être sûr que la classe concernée est bien requêtée, il faut
        # donc ajouter des outerjoins pour chaque classe liée.

        # NOTE: on ne gère pas les alias (les joins sur deux tables identiques
        # pour deux relations différentes)
        already_added = []
        for criterion in self.criteria:
            # On génère le filtre
            filter_ = criterion.gen_filter()

            # si il n'y a pas de filtres ...
            if filter_ is not None:
                # On récupère l'objet lié
                join_class = criterion.get_join_class()
                # Si il y a un outerjoin à faire (le critère se fait sur un
                # attribut de l'objet lié)
                if join_class is not None:
                    # on ne va pas outerjoiné deux fois la classe pour le même
                    # critère
                    if criterion.key not in already_added:
                        query = query.outerjoin(join_class)
                        already_added.append(criterion.key)

                query = query.filter(filter_)
        return query
Esempio n. 18
0
    def query(self):
        """
        Returns the main query used to find objects

        E.G:

            query = DBSESSION().query(distinct(UserDatas.id), UserDatas)
            query = query.filter(UserDatas.name.startswith('test'))
            query = query.outerjoin(UserDatas.conseiller)
            query = query.filter(User.lastname=='A manager')
        """
        query = DBSESSION().query(distinct(self.model.id), self.model)

        # Pour chaque critère sur lesquels on va ajouter des filtres, on a
        # besoin d'être sûr que la classe concernée est bien requêtée, il faut
        # donc ajouter des outerjoins pour chaque classe liée.

        # NOTE: on ne gère pas les alias (les joins sur deux tables identiques
        # pour deux relations différentes)
        already_added = []
        for criterion in self.criteria:
            # On génère le filtre
            filter_ = criterion.gen_filter()

            # si il n'y a pas de filtres ...
            if filter_ is not None:
                # On récupère l'objet lié
                join_class = criterion.get_join_class()
                # Si il y a un outerjoin à faire (le critère se fait sur un
                # attribut de l'objet lié)
                if join_class is not None:
                    # on ne va pas outerjoiné deux fois la classe pour le même
                    # critère
                    if criterion.key not in already_added:
                        query = query.outerjoin(join_class)
                        already_added.append(criterion.key)

                query = query.filter(filter_)
        return query