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)))))
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)
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))
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))
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)
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)
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
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
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()
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
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()
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)
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) ) )) )
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)))
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()
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()
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.")
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
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"])
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 """))
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
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)
def _getRepositoriesClause(self): dsp = self.distro_source_package return And( GitRepository.owner == self.owner, GitRepository.distribution == dsp.distribution, GitRepository.sourcepackagename == dsp.sourcepackagename)
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"])
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))
def iterReady(): """See `IJobSource`.""" return IStore(ProcessAcceptedBugsJob).find( (ProcessAcceptedBugsJob), And(ProcessAcceptedBugsJob.job == Job.id, Job.id.is_in(Job.ready_jobs)))
def iterReady(): """See `IJobSource`.""" return IStore(POFileStatsJob).find((POFileStatsJob), And(POFileStatsJob.job == Job.id, Job.id.is_in(Job.ready_jobs)))