Example #1
0
    def search(self, query, vocab_filter=None):
        """Return a resultset of archives.

        This is a helper required by `SQLObjectVocabularyBase.searchForTerms`.
        """
        if not query:
            return self.emptySelectResults()

        query = query.lower()

        if query.startswith('~'):
            query = query.strip('~')
        if query.startswith('ppa:'):
            query = query[4:]
        try:
            query_split = query.split('/')
            if len(query_split) == 3:
                owner_name, distro_name, archive_name = query_split
            else:
                owner_name, archive_name = query_split
        except ValueError:
            search_clause = Or(
                fti_search(Archive, query), fti_search(Person, query))
        else:
            search_clause = And(
                Person.name == owner_name, Archive.name == archive_name)

        clause = And(
            self._filter,
            get_enabled_archive_filter(
                getUtility(ILaunchBag).user, purpose=ArchivePurpose.PPA,
                include_public=True),
            search_clause)
        return self._table.select(
            clause, orderBy=self._orderBy, clauseTables=self._clauseTables)
    def findRecipes(branch_or_repository, revspecs=None):
        """Find recipes for a given branch or repository.

        :param branch_or_repository: The branch or repository to search for.
        :param revspecs: If not None, return only recipes whose `revspec` is
            in this sequence.
        :return: a collection of `ISourcePackageRecipe`s.
        """
        from lp.code.model.sourcepackagerecipe import SourcePackageRecipe
        store = Store.of(branch_or_repository)
        if IGitRepository.providedBy(branch_or_repository):
            data_clause = (SourcePackageRecipeData.base_git_repository ==
                           branch_or_repository)
            insn_clause = (_SourcePackageRecipeDataInstruction.git_repository
                           == branch_or_repository)
        elif IBranch.providedBy(branch_or_repository):
            data_clause = (
                SourcePackageRecipeData.base_branch == branch_or_repository)
            insn_clause = (_SourcePackageRecipeDataInstruction.branch ==
                           branch_or_repository)
        else:
            raise AssertionError("Unsupported source: %r" %
                                 (branch_or_repository, ))
        if revspecs is not None:
            concrete_revspecs = [
                revspec for revspec in revspecs if revspec is not None
            ]
            data_revspec_clause = In(SourcePackageRecipeData.revspec,
                                     concrete_revspecs)
            insn_revspec_clause = In(
                _SourcePackageRecipeDataInstruction.revspec, concrete_revspecs)
            if None in revspecs:
                data_revspec_clause = Or(
                    data_revspec_clause,
                    SourcePackageRecipeData.revspec == None)
                insn_revspec_clause = Or(
                    insn_revspec_clause,
                    _SourcePackageRecipeDataInstruction.revspec == None)
            data_clause = And(data_clause, data_revspec_clause)
            insn_clause = And(insn_clause, insn_revspec_clause)
        return store.find(
            SourcePackageRecipe,
            SourcePackageRecipe.id.is_in(
                Union(
                    Select(SourcePackageRecipeData.sourcepackage_recipe_id,
                           data_clause),
                    Select(
                        SourcePackageRecipeData.sourcepackage_recipe_id,
                        And(
                            _SourcePackageRecipeDataInstruction.recipe_data_id
                            == SourcePackageRecipeData.id, insn_clause)))))
Example #3
0
 def iterReady(cls):
     """Iterate through all ready DistributionJobs."""
     jobs = IStore(DistributionJob).find(
         DistributionJob,
         And(DistributionJob.job_type == cls.class_job_type,
             DistributionJob.job == Job.id,
             Job.id.is_in(Job.ready_jobs)))
     return (cls(job) for job in jobs)
Example #4
0
def known_name(form, field):
	site = Object.by_oid(form.site.data)
	m = [ Template.parent_id == site.id, Template.name == field.data ]

	id = getattr(form,"id",None)
	if id:
		m.append(Template.id != id)

	if db.store.find(Template,And(*m)).count():
		raise ValidationError("Diese Vorlage existiert bereits.")
    def findByTranslationsImportBranch(
            self, branch, force_translations_upload=False):
        """See IProductSeriesSet."""
        conditions = [ProductSeries.branch == branch]
        if not force_translations_upload:
            import_mode = ProductSeries.translations_autoimport_mode
            conditions.append(
                import_mode != TranslationsBranchImportMode.NO_IMPORT)

        return Store.of(branch).find(ProductSeries, And(*conditions))
Example #6
0
    def _getThrottlers(self, after):
        """Return a result set of entries affecting throttling decisions.

        :param after: Explicit cut off date.
        :type after: `datetime.datetime`
        """
        return Store.of(self.sender).find(
            UserToUserEmail,
            And(UserToUserEmail.sender == self.sender,
                UserToUserEmail.date_sent >= after))
Example #7
0
 def getUsedBugTagsWithOpenCounts(self,
                                  user,
                                  tag_limit=0,
                                  include_tags=None):
     """See IBugTarget."""
     # Circular fail.
     from lp.bugs.model.bugsummary import BugSummary
     return get_bug_tags_open_count(And(
         BugSummary.distroseries == self.distroseries,
         BugSummary.sourcepackagename == self.sourcepackagename),
                                    user,
                                    tag_limit=tag_limit,
                                    include_tags=include_tags)
Example #8
0
def deleteTagValues(store, tagIDs, objectIDs):
    """Delete those L{TagValue}s whose tagID is in tagIDs and whose
    objectID is in objectIDs.

    @param store: The store to use when fetching data.
    @param tagIDs: A sequence of L{TagValue.tagID}s to match values against.
    @param objectIDs: A sequence of L{TagValue.objectID}s to match values
        against.
    """
    result = store.find(
        And(TagValue.tagID.is_in(tagIDs),
            TagValue.objectID.is_in(objectIDs))).remove()
    if result:
        touchObjects(objectIDs)
Example #9
0
    def get_users(self, **options):
        '''
        Returns users using given options.
        
        @param **options: 
            id: user ID
            fullname: user full name
            is_active: user activation flag
            is_superuser: supper user determination flag
        
        @return: [DynamicObject<user info...>]
        '''
        
        store = get_current_transaction_store()
        expressions = []
        
        id = options.get('id')
        if id is not None:
            expressions.append([And(UserEntity, UserEntity.id == int(id))])
            
        fullname = options.get('fullname')
        if fullname is not None:
            expressions.append([Like(UserEntity, UserEntity.fullname, fullname)])

        is_active = options.get('is_active')
        if is_active is not None:
            expressions.append([And(UserEntity, UserEntity.is_active == bool(is_active))])

        is_superuser = options.get('is_superuser')
        if is_active is not None:
            expressions.append([And(UserEntity, UserEntity.is_superuser == bool(is_superuser))])
            
        entities = store.find(UserEntity, *expressions)
        results = []
        for entity in entities:
            results.append(DynamicObject(entity_to_dic(entity)))
        return results
Example #10
0
 def get_role_users(self, role_id, **options):
     '''
     Returns all user which are assigned to specified role.
     
     @param role_id: role ID
     
     @return: [user as DynamicObject]
     '''
     
     store = get_current_transaction_store()
     entities = store.find(UserEntity, And(UserEntity.id == User2RoleEntity.user_id,
                                           User2RoleEntity.role_id == unicode(role_id)))
     results = []
     for entity in entities:
         results.append(DynamicObject(entity_to_dic(entity)))
     return results
Example #11
0
 def unassign_role(self, user_id, role_ids):
     '''
     Unassigns given roles from specified user.
     
     @param user_id: user ID
     @param role_ids: list role ID
     '''
     
     store = get_current_transaction_store()
     for role_id in role_ids:
         entity = store.find(User2RoleEntity, 
                             And(User2RoleEntity.user_id == unicode(user_id),
                                 User2RoleEntity.role_id == unicode(role_id))).one()
         if entity is not None:
             store.remove(entity)
     store.flush()
Example #12
0
    def get_permission_roles(self, permission_id, **options):
        '''
        Returns all roles which are including specified permission.
        
        @param permission_id: permission ID
        
        @return: [role as DynamicObject]
        '''

        store = get_current_transaction_store()
        entities = store.find(RoleEntity, And(RoleEntity.id == Role2PermissionEntity.role_id,
                                              Role2PermissionEntity.permission_id == unicode(permission_id)))
        results = []
        for entity in entities:
            results.append(DynamicObject(entity_to_dic(entity)))
        return results
Example #13
0
 def deny_permission(self, role_id, permission_ids):
     '''
     Denies given permissions.
     
     @param role_id: role ID
     @param permission_ids: list of permission ID
     '''
     
     store = get_current_transaction_store()
     for permission_id in permission_ids:
         entity = store.find(Role2PermissionEntity,
                             And(Role2PermissionEntity.role_id == unicode(role_id),
                                 Role2PermissionEntity.permission_id == unicode(permission_id))).one()
         if entity is not None:
             store.remove(entity)
     store.flush()
Example #14
0
def getTagValues(values=None):
    """Get L{TagValue}s.

    @param values: Optionally, a sequence of C{(objectID, Tag.id)} 2-tuples to
        filter the result with.
    @return: A C{ResultSet} with L{TagValue}s.
    """
    store = getMainStore()
    where = []
    if values:
        expressions = [
            And(TagValue.objectID == objectID, TagValue.tagID == tagID)
            for objectID, tagID in values
        ]
        where = [Or(*expressions)]
    return store.find(TagValue, *where)
Example #15
0
 def findRecipes(branch):
     from lp.code.model.sourcepackagerecipe import SourcePackageRecipe
     store = Store.of(branch)
     return store.find(
         SourcePackageRecipe,
         SourcePackageRecipe.id.is_in(Union(
             Select(
                 SourcePackageRecipeData.sourcepackage_recipe_id,
                 SourcePackageRecipeData.base_branch == branch),
             Select(
                 SourcePackageRecipeData.sourcepackage_recipe_id,
                 And(
                     _SourcePackageRecipeDataInstruction.recipe_data_id ==
                     SourcePackageRecipeData.id,
                     _SourcePackageRecipeDataInstruction.branch == branch)
                 )
         ))
     )
Example #16
0
 def unscheduleDeletion(archive_files):
     """See `IArchiveFileSet`."""
     clauses = [
         ArchiveFile.id.is_in(
             set(archive_file.id for archive_file in archive_files)),
         ArchiveFile.library_file == LibraryFileAlias.id,
         LibraryFileAlias.content == LibraryFileContent.id,
     ]
     return_columns = [
         ArchiveFile.container, ArchiveFile.path, LibraryFileContent.sha256
     ]
     return list(
         IMasterStore(ArchiveFile).execute(
             Returning(BulkUpdate(
                 {ArchiveFile.scheduled_deletion_date: None},
                 table=ArchiveFile,
                 values=[LibraryFileAlias, LibraryFileContent],
                 where=And(*clauses)),
                       columns=return_columns)))
Example #17
0
 def assign_role(self, user_id, role_ids):
     '''
     Assigns given roles to specified user.
     
     @param user_id: user ID
     @param role_ids: list role ID
     '''
     
     store = get_current_transaction_store()
     for role_id in role_ids:
         entity = store.find(User2RoleEntity, 
                             And(User2RoleEntity.user_id == unicode(user_id),
                                 User2RoleEntity.role_id == unicode(role_id))).one()
         if entity is None:
             u2r = User2RoleEntity()
             u2r.user_id = unicode(user_id)
             u2r.role_id = unicode(role_id)
             store.add(u2r)
     store.flush()
Example #18
0
 def grant_permission(self, role_id, permission_ids):
     '''
     Grants given permissions.
     
     @param role_id: role ID
     @param permission_ids: list of permission ID
     '''
     
     store = get_current_transaction_store()
     for permission_id in permission_ids:
         entity = store.find(Role2PermissionEntity,
                             And(Role2PermissionEntity.role_id == unicode(role_id),
                                 Role2PermissionEntity.permission_id == unicode(permission_id))).one()
         if entity is None:
             r2p = Role2PermissionEntity()
             r2p.permission_id = unicode(permission_id)
             r2p.role_id = unicode(role_id)
             store.add(r2p)
     store.flush()
Example #19
0
def known_match(form, field):
    if form.inherit.data == "Yes": inherit = True
    elif form.inherit.data == "No": inherit = False
    elif form.inherit.data == "*": inherit = None
    else: assert False

    dest = Object.by_oid(form.oid.data)

    m = [
        TemplateMatch.inherit == inherit,
        TemplateMatch.objtyp == int(form.objtyp.data),
        TemplateMatch.detail == int(form.detail.data),
        TemplateMatch.parent_id == dest.id
    ]
    id = getattr(form, "id", None)
    if id:
        m.append(TemplateMatch.id != id)

    if db.store.find(TemplateMatch, And(*m)).count():
        raise ValidationError("Diese Vorlage existiert dort bereits.")
Example #20
0
 def get_permissions(self, **options):
     '''
     Returns a list of permission considering given options.
     
     @param **options:
         role_id: role ID
     
     '''
     
     store = get_current_transaction_store()
     expressions = []
     
     role_id = options.get('role_id')
     if role_id is not None:
         expressions.append([And(Role2PermissionEntity.permission_id == PermissionEntity.id,
                                 Role2PermissionEntity.role_id == unicode(role_id))])
     
     entities = store.find(PermissionEntity, *expressions)
     results = []
     for entity in entities:
         results.append(DynamicObject(entity_to_dic(entity)))
     return results
Example #21
0
 def preloadBuildsData(self, builds):
     # Circular import.
     from lp.snappy.model.snap import Snap
     load_related(Person, builds, ["requester_id"])
     lfas = load_related(LibraryFileAlias, builds, ["log_id"])
     load_related(LibraryFileContent, lfas, ["contentID"])
     archives = load_related(Archive, builds, ["archive_id"])
     load_related(Person, archives, ["ownerID"])
     distroarchseries = load_related(
         DistroArchSeries, builds, ['distro_arch_series_id'])
     distroseries = load_related(
         DistroSeries, distroarchseries, ['distroseriesID'])
     load_related(Distribution, distroseries, ['distributionID'])
     snaps = load_related(Snap, builds, ["snap_id"])
     getUtility(ISnapSet).preloadDataForSnaps(snaps)
     snapbuild_ids = set(map(attrgetter("id"), builds))
     latest_jobs_cte = With("LatestJobs", Select(
         (SnapBuildJob.job_id,
          SQL(
              "rank() OVER "
              "(PARTITION BY snapbuild ORDER BY job DESC) AS rank")),
         tables=SnapBuildJob,
         where=And(
             SnapBuildJob.snapbuild_id.is_in(snapbuild_ids),
             SnapBuildJob.job_type == SnapBuildJobType.STORE_UPLOAD)))
     LatestJobs = Table("LatestJobs")
     sbjs = list(IStore(SnapBuildJob).with_(latest_jobs_cte).using(
         SnapBuildJob, LatestJobs).find(
             SnapBuildJob,
             SnapBuildJob.job_id == Column("job", LatestJobs),
             Column("rank", LatestJobs) == 1))
     sbj_map = {}
     for sbj in sbjs:
         sbj_map[sbj.snapbuild] = sbj.makeDerived()
     for build in builds:
         get_property_cache(build).last_store_upload_job = (
             sbj_map.get(build))
     load_related(Job, sbjs, ["job_id"])
Example #22
0
 def reap(archive, container=None):
     """See `IArchiveFileSet`."""
     # XXX cjwatson 2016-03-30 bug=322972: Requires manual SQL due to
     # lack of support for DELETE FROM ... USING ... in Storm.
     clauses = [
         ArchiveFile.archive == archive,
         ArchiveFile.scheduled_deletion_date < _now(),
         ArchiveFile.library_file_id == LibraryFileAlias.id,
         LibraryFileAlias.contentID == LibraryFileContent.id,
     ]
     if container is not None:
         clauses.append(ArchiveFile.container == container)
     where = convert_storm_clause_to_string(And(*clauses))
     return list(
         IMasterStore(ArchiveFile).execute("""
         DELETE FROM ArchiveFile
         USING LibraryFileAlias, LibraryFileContent
         WHERE """ + where + """
         RETURNING
             ArchiveFile.container,
             ArchiveFile.path,
             LibraryFileContent.sha256
         """))
Example #23
0
    def get_roles(self, **options):
        '''
        Returns roles considering given options.
        
        @param **options:
            user_id: user ID
        
        @return: [DynamicObject<...>]
        '''

        store = get_current_transaction_store()
        
        expressions = []
        
        user_id = options.get('user_id')
        if user_id is not None:
            expressions.append([And(User2RoleEntity.user_id == unicode(user_id),
                                    User2RoleEntity.role_id == RoleEntity.id)])
        
        entities = store.find(RoleEntity, *expressions)
        results = []
        for entity in entities:
            results.append(DynamicObject(entity_to_dic(entity)))
        return results
Example #24
0
class PPAVocabulary(SQLObjectVocabularyBase):

    _table = Archive
    _orderBy = ['Person.name, Archive.name']
    _clauseTables = ['Person']
    # This should probably also filter by privacy, but that becomes
    # problematic when you need to remove a dependency that you can no
    # longer see.
    _filter = And(
        Archive._enabled == True,
        Person.q.id == Archive.q.ownerID,
        Archive.q.purpose == ArchivePurpose.PPA)
    displayname = 'Select a PPA'
    step_title = 'Search'

    def toTerm(self, archive):
        """See `IVocabulary`."""
        summary = "No description available"
        try:
            if archive.description:
                summary = archive.description.splitlines()[0]
        except Unauthorized:
            pass
        return SimpleTerm(archive, archive.reference, summary)

    def getTermByToken(self, token):
        """See `IVocabularyTokenized`."""
        obj = getUtility(IArchiveSet).getByReference(token)
        if obj is None or not obj.enabled or not obj.is_ppa:
            raise LookupError(token)
        return self.toTerm(obj)

    def search(self, query, vocab_filter=None):
        """Return a resultset of archives.

        This is a helper required by `SQLObjectVocabularyBase.searchForTerms`.
        """
        if not query:
            return self.emptySelectResults()

        query = query.lower()

        if query.startswith('~'):
            query = query.strip('~')
        if query.startswith('ppa:'):
            query = query[4:]
        try:
            query_split = query.split('/')
            if len(query_split) == 3:
                owner_name, distro_name, archive_name = query_split
            else:
                owner_name, archive_name = query_split
        except ValueError:
            search_clause = Or(
                fti_search(Archive, query), fti_search(Person, query))
        else:
            search_clause = And(
                Person.name == owner_name, Archive.name == archive_name)

        clause = And(
            self._filter,
            get_enabled_archive_filter(
                getUtility(ILaunchBag).user, purpose=ArchivePurpose.PPA,
                include_public=True),
            search_clause)
        return self._table.select(
            clause, orderBy=self._orderBy, clauseTables=self._clauseTables)
Example #25
0
 def _getRepositoriesClause(self):
     dsp = self.distro_source_package
     return And(
         GitRepository.owner == self.owner,
         GitRepository.distribution == dsp.distribution,
         GitRepository.sourcepackagename == dsp.sourcepackagename)
Example #26
0
def editor(request, obj=None, parent=None):
    form = TemplateMatchForm(request.form, prefix="template")
    if not parent:
        form.id = obj.id
    if request.method == 'POST' and form.validate():
        if form.inherit.data == "Yes": inherit = True
        elif form.inherit.data == "No": inherit = False
        elif form.inherit.data == "*": inherit = None
        else: assert False

        dest = Object.by_oid(form.oid.data)

        if parent:
            obj = TemplateMatch.new(parent, int(form.objtyp.data),
                                    int(form.detail.data),
                                    form.page.data.replace("\r", ""))
        else:
            obj.record_change()
            obj.data = form.page.data.replace("\r", "")

        obj.objtyp = int(form.objtyp.data)
        obj.detail = int(form.detail.data)
        obj.inherit = inherit
        db.store.flush()

        flash(u"Gespeichert.", True)

        # Now filter other templates to look for overlaps
        m = [
            TemplateMatch.objtyp == obj.objtyp,
            TemplateMatch.detail == obj.detail, TemplateMatch.obj_id == obj.id
        ]
        if obj.inherit is None:
            m.append(TemplateMatch.inherit != None)
        else:
            m.append(TemplateMatch.inherit == None)
        m = db.store.find(TemplateMatch, And(*m))
        if obj.inherit is None:
            if m.count():
                flash(u"Vorherige Assoziation(en) entfernt.")
                for mm in m:
                    db.store.remove(mm)
        else:
            if m.count():
                flash(u"Bestehende Assoziation eingeschränkt.")
                for mm in m:
                    mm.inherit = not obj.inherit

        return redirect(url_for("pybble.views.view_oid", oid=dest.oid))

    elif request.method == 'GET':
        if obj:
            form.page.data = obj.data
            form.objtyp.data = str(obj.objtyp)
            form.detail.data = str(obj.detail)
            form.inherit.data = "*" if obj.inherit is None else "Yes" if obj.inherit else "No"
        else:
            form.detail.data = str(TM_DETAIL_PAGE)
            form.objtyp.data = str(parent.objtyp)
            form.inherit.data = "*"
        if parent:
            form.oid.data = parent.oid
        else:
            form.oid.data = obj.parent.oid

    return render_template('edit/templatematch.html',
                           obj=obj,
                           parent=parent,
                           form=form,
                           title_trace=["Template-Editor"])
Example #27
0
 def getBugSummaryContextWhereClause(self):
     """See BugTargetBase."""
     # Circular fail.
     from lp.bugs.model.bugsummary import BugSummary
     return And(BugSummary.distroseries == self.distroseries,
                BugSummary.sourcepackagename == self.sourcepackagename)
 def _filter(self):
     user = getattr(getUtility(ILaunchBag), 'user', None)
     return And(
         SpecificationDependency.specificationID == self.context.id,
         SpecificationDependency.dependencyID == Specification.id,
         *get_specification_privacy_filter(user))
Example #29
0
 def iterReady():
     """See `IJobSource`."""
     return IStore(ProcessAcceptedBugsJob).find(
         (ProcessAcceptedBugsJob),
         And(ProcessAcceptedBugsJob.job == Job.id,
             Job.id.is_in(Job.ready_jobs)))
Example #30
0
 def iterReady():
     """See `IJobSource`."""
     return IStore(POFileStatsJob).find((POFileStatsJob),
                                        And(POFileStatsJob.job == Job.id,
                                            Job.id.is_in(Job.ready_jobs)))