def __init__(self, collection): self.collection = collection self.delimiter = self._delimiter_map[csv.excel.delimiter] self.lineterminator = self._lineterminator_map[ csv.excel.lineterminator] self.quotechar = self._quotechar_map[csv.excel.quotechar] self.quoting = self._quoting_map[csv.excel.quoting] self.doublequote = csv.excel.doublequote self.dateformat = '%Y-%m-%d' self.all_columns = [ ('id', 'Identifier'), ('description', 'Description'), ('created', 'Created'), ('destroyed', 'Destroyed'), ('location', 'Location'), # XXX Figure out a reasonable cross-database way of including this # (SQLite supports GROUP_CONCAT, PostgreSQL has a string_agg but # only in 9+, or we could use Python expressions if we don't care # about efficieny...) #('parents' , 'Parents') , #('children' , 'Children') , ] self.all_columns.extend( DBSession.query('code_' + SampleCode.name, SampleCode.name).\ join(Sample).\ join(Collection).\ filter(Collection.id==collection.id).\ distinct().all()) self.columns = [name for (name, title) in self.all_columns] self.all_columns = dict(self.all_columns)
def __init__(self, collection): self.collection = collection self.delimiter = self._delimiter_map[csv.excel.delimiter] self.lineterminator = self._lineterminator_map[csv.excel.lineterminator] self.quotechar = self._quotechar_map[csv.excel.quotechar] self.quoting = self._quoting_map[csv.excel.quoting] self.doublequote = csv.excel.doublequote self.dateformat = '%Y-%m-%d' self.all_columns = [ ('id' , 'Identifier') , ('description' , 'Description') , ('created' , 'Created') , ('destroyed' , 'Destroyed') , ('location' , 'Location') , # XXX Figure out a reasonable cross-database way of including this # (SQLite supports GROUP_CONCAT, PostgreSQL has a string_agg but # only in 9+, or we could use Python expressions if we don't care # about efficieny...) #('parents' , 'Parents') , #('children' , 'Children') , ] self.all_columns.extend( DBSession.query('code_' + SampleCode.name, SampleCode.name).\ join(Sample).\ join(Collection).\ filter(Collection.id==collection.id).\ distinct().all()) self.columns = [name for (name, title) in self.all_columns] self.all_columns = dict(self.all_columns)
def __init__(self, request): super(CollectionContextFactory, self).__init__(request) self.collection = DBSession.query(Collection).\ filter_by(id=request.matchdict['collection_id']).one() # If the collection has an open-license grant view permission to anyone if self.collection.license.is_open: self.__acl__.append((Allow, Everyone, (VIEW_COLLECTION, )))
def __init__(self, request): super(CollectionContextFactory, self).__init__(request) self.collection = DBSession.query(Collection).\ filter_by(id=request.matchdict['collection_id']).one() # If the collection has an open-license grant view permission to anyone if self.collection.license.is_open: self.__acl__.append( (Allow, Everyone, (VIEW_COLLECTION,)) )
def open(self): return dict( title='Open Collections', # XXX Perform the open filter with a query collections=[ collection for collection in DBSession.query(Collection) if collection.license.is_open ] )
def edit(self): collection = self.context.collection form = Form( self.request, schema=CollectionEditSchema, obj=collection, variable_decode=True) if form.validate(): form.bind(collection) # Ensure the edit cannot change ownership by current user collection.users[self.request.user] = DBSession.query(Role).\ filter(Role.id==OWNER_ROLE).one() return HTTPFound(location=form.came_from) return dict(form=FormRenderer(form))
def create(self): # TODO Determine user timezone as default form = Form(self.request, schema=AccountCreateSchema) if form.validate(): new_user = form.bind(User()) DBSession.add(new_user) new_email = form.bind(EmailAddress()) new_email.user = new_user DBSession.add(new_email) new_collection = Collection() new_collection.name = 'Default' new_collection.owner = new_user.full_name owner_role = DBSession.query(Role).filter(Role.id == 'owner').one() new_user.collections[new_collection] = owner_role return HTTPFound(location=self.request.route_url( 'account_verify_email', _query=dict(email=form.data['email']))) return dict(form=FormRenderer(form))
def create(self): form = Form( self.request, schema=CollectionCreateSchema, variable_decode=True, defaults=dict(owner=self.request.user.full_name)) if form.validate(): new_collection = form.bind(Collection()) # Hard-code ownership to currently authenticated user new_collection.users[self.request.user] = DBSession.query(Role).\ filter(Role.id==OWNER_ROLE).one() DBSession.add(new_collection) DBSession.flush() return HTTPFound( location=self.request.route_url( 'collections_view', collection_id=new_collection.id)) return dict(form=FormRenderer(form))
def create(self): # TODO Determine user timezone as default form = Form(self.request, schema=AccountCreateSchema) if form.validate(): new_user = form.bind(User()) DBSession.add(new_user) new_email = form.bind(EmailAddress()) new_email.user = new_user DBSession.add(new_email) new_collection = Collection() new_collection.name = "Default" new_collection.owner = new_user.full_name owner_role = DBSession.query(Role).filter(Role.id == "owner").one() new_user.collections[new_collection] = owner_role return HTTPFound( location=self.request.route_url("account_verify_email", _query=dict(email=form.data["email"])) ) return dict(form=FormRenderer(form))
def combine(self): form = Form( self.request, schema=SampleCombineSchema, variable_decode=True) if form.validate(): new_sample = Sample.combine( self.request.user, form.data['collection'], form.data['aliquots']) return HTTPFound( location=self.request.route_url( 'samples_view', sample_id=new_sample.id)) return dict( form=FormRenderer(form), samples=DBSession.query(Sample).\ filter(Sample.collection==self.context.collection).\ filter(Sample.destroyed==None), )
def export(self, output_file): """ Export the collection to the specified file. `output_file` : a file-like object which the CSV will be written to """ columns = [] aliases = [] for column in self.columns: if column.startswith('code_'): alias = aliased(SampleCode) aliases.append((alias, column[len('code_'):])) columns.append(getattr(alias, 'value')) elif column in ('parents', 'children'): raise NotImplementedError else: columns.append(Sample.__table__.columns[column]) query = DBSession.query(*columns).select_from(Sample).\ filter(Sample.collection_id==self.collection.id) for alias, name in aliases: query = query.\ outerjoin(alias, (Sample.id==getattr(alias, 'sample_id')) & (getattr(alias, 'name')==name) ) writer = csv.writer( output_file, delimiter=self._delimiter_inv[self.delimiter], lineterminator=self._lineterminator_inv[self.lineterminator], quotechar=self._quotechar_inv[self.quotechar], quoting=self._quoting_inv[self.quoting], doublequote=self.doublequote) for row in query: # Rewrite the format of datetime values to exclude microseconds # (which confuse several spreadsheet parsers and which it's # unlikely anyone cares about) row = [ value.strftime(self.dateformat) if isinstance(value, datetime) else value for value in row ] writer.writerow(row)
def export(self, output_file): """ Export the collection to the specified file. `output_file` : a file-like object which the CSV will be written to """ columns = [] aliases = [] for column in self.columns: if column.startswith('code_'): alias = aliased(SampleCode) aliases.append((alias, column[len('code_'):])) columns.append(getattr(alias, 'value')) elif column in ('parents', 'children'): raise NotImplementedError else: columns.append(Sample.__table__.columns[column]) query = DBSession.query(*columns).select_from(Sample).\ filter(Sample.collection_id==self.collection.id) for alias, name in aliases: query = query.\ outerjoin(alias, (Sample.id==getattr(alias, 'sample_id')) & (getattr(alias, 'name')==name) ) writer = csv.writer(output_file, delimiter=self._delimiter_inv[self.delimiter], lineterminator=self._lineterminator_inv[self.lineterminator], quotechar=self._quotechar_inv[self.quotechar], quoting=self._quoting_inv[self.quoting], doublequote=self.doublequote) for row in query: # Rewrite the format of datetime values to exclude microseconds # (which confuse several spreadsheet parsers and which it's # unlikely anyone cares about) row = [ value.strftime(self.dateformat) if isinstance(value, datetime) else value for value in row ] writer.writerow(row)
def roles(self): return [ (role.id, role.id.title()) for role in DBSession.query(Role) ]
def open_collections(self): return [ collection for collection in DBSession.query(Collection).all() if collection.license.is_open ]