Пример #1
0
 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)
Пример #2
0
 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)
Пример #3
0
 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, )))
Пример #4
0
 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,))
             )
Пример #5
0
 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
             ]
         )
Пример #6
0
 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))
Пример #7
0
 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))
Пример #8
0
 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))
Пример #9
0
 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))
Пример #10
0
 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),
         )
Пример #11
0
    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)
Пример #12
0
    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)
Пример #13
0
 def roles(self):
     return [
         (role.id, role.id.title())
         for role in DBSession.query(Role)
         ]
Пример #14
0
 def open_collections(self):
     return [
         collection
         for collection in DBSession.query(Collection).all()
         if collection.license.is_open
         ]