Show More
The requested changes are too big and content was truncated. Show full diff
|
1 | NO CONTENT: new file 100644 | |
The requested commit or file is too big and content was truncated. Show full diff |
@@ -0,0 +1,30 b'' | |||
|
1 | import logging | |
|
2 | ||
|
3 | from sqlalchemy import * | |
|
4 | ||
|
5 | from rhodecode.model import meta | |
|
6 | from rhodecode.lib.dbmigrate.versions import _reset_base, notify | |
|
7 | ||
|
8 | log = logging.getLogger(__name__) | |
|
9 | ||
|
10 | ||
|
11 | def upgrade(migrate_engine): | |
|
12 | """ | |
|
13 | Upgrade operations go here. | |
|
14 | Don't create your own engine; bind migrate_engine to your metadata | |
|
15 | """ | |
|
16 | _reset_base(migrate_engine) | |
|
17 | from rhodecode.lib.dbmigrate.schema import db_4_16_0_2 as db | |
|
18 | ||
|
19 | db.FileStore.__table__.create() | |
|
20 | ||
|
21 | fixups(db, meta.Session) | |
|
22 | ||
|
23 | ||
|
24 | def downgrade(migrate_engine): | |
|
25 | meta = MetaData() | |
|
26 | meta.bind = migrate_engine | |
|
27 | ||
|
28 | ||
|
29 | def fixups(models, _SESSION): | |
|
30 | pass |
@@ -45,7 +45,7 b' PYRAMID_SETTINGS = {}' | |||
|
45 | 45 | EXTENSIONS = {} |
|
46 | 46 | |
|
47 | 47 | __version__ = ('.'.join((str(each) for each in VERSION[:3]))) |
|
48 |
__dbversion__ = 9 |
|
|
48 | __dbversion__ = 95 # defines current db version for migrations | |
|
49 | 49 | __platform__ = platform.system() |
|
50 | 50 | __license__ = 'AGPLv3, and Commercial License' |
|
51 | 51 | __author__ = 'RhodeCode GmbH' |
@@ -417,65 +417,3 b' def store_exception(request, apiuser, ex' | |||
|
417 | 417 | exc_url = request.route_url( |
|
418 | 418 | 'admin_settings_exception_tracker_show', exception_id=exc_id) |
|
419 | 419 | return {'exc_id': exc_id, 'exc_url': exc_url} |
|
420 | ||
|
421 | ||
|
422 | @jsonrpc_method() | |
|
423 | def upload_file(request, apiuser, filename, content): | |
|
424 | """ | |
|
425 | Upload API for the file_store | |
|
426 | ||
|
427 | Example usage from CLI:: | |
|
428 | rhodecode-api --instance-name=enterprise-1 upload_file "{\"content\": \"$(cat image.jpg | base64)\", \"filename\":\"image.jpg\"}" | |
|
429 | ||
|
430 | ||
|
431 | This command can only be run using an |authtoken| with admin rights to | |
|
432 | the specified repository. | |
|
433 | ||
|
434 | This command takes the following options: | |
|
435 | ||
|
436 | :param apiuser: This is filled automatically from the |authtoken|. | |
|
437 | :type apiuser: AuthUser | |
|
438 | :param filename: name of the file uploaded | |
|
439 | :type filename: str | |
|
440 | :param content: base64 encoded content of the uploaded file | |
|
441 | :type prefix: str | |
|
442 | ||
|
443 | Example output: | |
|
444 | ||
|
445 | .. code-block:: bash | |
|
446 | ||
|
447 | id : <id_given_in_input> | |
|
448 | result: { | |
|
449 | "access_path": "/_file_store/download/84d156f7-8323-4ad3-9fce-4a8e88e1deaf-0.jpg", | |
|
450 | "access_path_fqn": "http://server.domain.com/_file_store/download/84d156f7-8323-4ad3-9fce-4a8e88e1deaf-0.jpg", | |
|
451 | "store_fid": "84d156f7-8323-4ad3-9fce-4a8e88e1deaf-0.jpg" | |
|
452 | } | |
|
453 | error : null | |
|
454 | """ | |
|
455 | if not has_superadmin_permission(apiuser): | |
|
456 | raise JSONRPCForbidden() | |
|
457 | ||
|
458 | storage = utils.get_file_storage(request.registry.settings) | |
|
459 | ||
|
460 | try: | |
|
461 | file_obj = compat.NativeIO(base64.decodestring(content)) | |
|
462 | except Exception as exc: | |
|
463 | raise JSONRPCError('File `{}` content decoding error: {}.'.format(filename, exc)) | |
|
464 | ||
|
465 | metadata = { | |
|
466 | 'filename': filename, | |
|
467 | 'size': '', # filled by save_file | |
|
468 | 'user_uploaded': {'username': apiuser.username, | |
|
469 | 'user_id': apiuser.user_id, | |
|
470 | 'ip': apiuser.ip_addr}} | |
|
471 | try: | |
|
472 | store_fid, metadata = storage.save_file(file_obj, filename, metadata=metadata) | |
|
473 | except FileNotAllowedException: | |
|
474 | raise JSONRPCError('File `{}` is not allowed.'.format(filename)) | |
|
475 | ||
|
476 | except FileOverSizeException: | |
|
477 | raise JSONRPCError('File `{}` is exceeding allowed limit.'.format(filename)) | |
|
478 | ||
|
479 | return {'store_fid': store_fid, | |
|
480 | 'access_path_fqn': request.route_url('download_file', fid=store_fid), | |
|
481 | 'access_path': request.route_path('download_file', fid=store_fid)} |
@@ -4841,6 +4841,62 b' class UserBookmark(Base, BaseModel):' | |||
|
4841 | 4841 | return u'<UserBookmark(%d @ %r)>' % (self.position, self.redirect_url) |
|
4842 | 4842 | |
|
4843 | 4843 | |
|
4844 | class FileStore(Base, BaseModel): | |
|
4845 | __tablename__ = 'file_store' | |
|
4846 | __table_args__ = ( | |
|
4847 | base_table_args | |
|
4848 | ) | |
|
4849 | ||
|
4850 | file_store_id = Column('file_store_id', Integer(), primary_key=True) | |
|
4851 | file_uid = Column('file_uid', String(1024), nullable=False) | |
|
4852 | file_display_name = Column('file_display_name', UnicodeText().with_variant(UnicodeText(2048), 'mysql'), nullable=True) | |
|
4853 | file_description = Column('file_description', UnicodeText().with_variant(UnicodeText(10240), 'mysql'), nullable=True) | |
|
4854 | file_org_name = Column('file_org_name', UnicodeText().with_variant(UnicodeText(10240), 'mysql'), nullable=False) | |
|
4855 | ||
|
4856 | # sha256 hash | |
|
4857 | file_hash = Column('file_hash', String(512), nullable=False) | |
|
4858 | file_size = Column('file_size', Integer(), nullable=False) | |
|
4859 | ||
|
4860 | created_on = Column('created_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now) | |
|
4861 | accessed_on = Column('accessed_on', DateTime(timezone=False), nullable=True) | |
|
4862 | accessed_count = Column('accessed_count', Integer(), default=0) | |
|
4863 | ||
|
4864 | enabled = Column('enabled', Boolean(), nullable=False, default=True) | |
|
4865 | ||
|
4866 | # if repo/repo_group reference is set, check for permissions | |
|
4867 | check_acl = Column('check_acl', Boolean(), nullable=False, default=True) | |
|
4868 | ||
|
4869 | user_id = Column('user_id', Integer(), ForeignKey('users.user_id'), nullable=False) | |
|
4870 | upload_user = relationship('User', lazy='joined', primaryjoin='User.user_id==FileStore.user_id') | |
|
4871 | ||
|
4872 | # scope limited to user, which requester have access to | |
|
4873 | scope_user_id = Column( | |
|
4874 | 'scope_user_id', Integer(), ForeignKey('users.user_id'), | |
|
4875 | nullable=True, unique=None, default=None) | |
|
4876 | user = relationship('User', lazy='joined', primaryjoin='User.user_id==FileStore.scope_user_id') | |
|
4877 | ||
|
4878 | # scope limited to user group, which requester have access to | |
|
4879 | scope_user_group_id = Column( | |
|
4880 | 'scope_user_group_id', Integer(), ForeignKey('users_groups.users_group_id'), | |
|
4881 | nullable=True, unique=None, default=None) | |
|
4882 | user_group = relationship('UserGroup', lazy='joined') | |
|
4883 | ||
|
4884 | # scope limited to repo, which requester have access to | |
|
4885 | scope_repo_id = Column( | |
|
4886 | 'scope_repo_id', Integer(), ForeignKey('repositories.repo_id'), | |
|
4887 | nullable=True, unique=None, default=None) | |
|
4888 | repo = relationship('Repository', lazy='joined') | |
|
4889 | ||
|
4890 | # scope limited to repo group, which requester have access to | |
|
4891 | scope_repo_group_id = Column( | |
|
4892 | 'scope_repo_group_id', Integer(), ForeignKey('groups.group_id'), | |
|
4893 | nullable=True, unique=None, default=None) | |
|
4894 | repo_group = relationship('RepoGroup', lazy='joined') | |
|
4895 | ||
|
4896 | def __repr__(self): | |
|
4897 | return '<FileStore({})>'.format(self.file_store_id) | |
|
4898 | ||
|
4899 | ||
|
4844 | 4900 | class DbMigrateVersion(Base, BaseModel): |
|
4845 | 4901 | __tablename__ = 'db_migrate_version' |
|
4846 | 4902 | __table_args__ = ( |
General Comments 0
You need to be logged in to leave comments.
Login now