Show More
@@ -157,3 +157,15 b' class VCSServerUnavailable(HTTPBadGatewa' | |||||
157 | if message: |
|
157 | if message: | |
158 | self.explanation += ': ' + message |
|
158 | self.explanation += ': ' + message | |
159 | super(VCSServerUnavailable, self).__init__() |
|
159 | super(VCSServerUnavailable, self).__init__() | |
|
160 | ||||
|
161 | ||||
|
162 | class ArtifactMetadataDuplicate(ValueError): | |||
|
163 | ||||
|
164 | def __init__(self, *args, **kwargs): | |||
|
165 | self.err_section = kwargs.pop('err_section', None) | |||
|
166 | self.err_key = kwargs.pop('err_key', None) | |||
|
167 | super(ArtifactMetadataDuplicate, self).__init__(*args, **kwargs) | |||
|
168 | ||||
|
169 | ||||
|
170 | class ArtifactMetadataBadValueType(ValueError): | |||
|
171 | pass |
@@ -67,6 +67,8 b' from rhodecode.lib.ext_json import json' | |||||
67 | from rhodecode.lib.caching_query import FromCache |
|
67 | from rhodecode.lib.caching_query import FromCache | |
68 | from rhodecode.lib.encrypt import AESCipher, validate_and_get_enc_data |
|
68 | from rhodecode.lib.encrypt import AESCipher, validate_and_get_enc_data | |
69 | from rhodecode.lib.encrypt2 import Encryptor |
|
69 | from rhodecode.lib.encrypt2 import Encryptor | |
|
70 | from rhodecode.lib.exceptions import ( | |||
|
71 | ArtifactMetadataDuplicate, ArtifactMetadataBadValueType) | |||
70 | from rhodecode.model.meta import Base, Session |
|
72 | from rhodecode.model.meta import Base, Session | |
71 |
|
73 | |||
72 | URL_SEP = '/' |
|
74 | URL_SEP = '/' | |
@@ -5146,6 +5148,10 b' class FileStore(Base, BaseModel):' | |||||
5146 | repo_group = relationship('RepoGroup', lazy='joined') |
|
5148 | repo_group = relationship('RepoGroup', lazy='joined') | |
5147 |
|
5149 | |||
5148 | @classmethod |
|
5150 | @classmethod | |
|
5151 | def get_by_store_uid(cls, file_store_uid): | |||
|
5152 | return FileStore.query().filter(FileStore.file_uid == file_store_uid).scalar() | |||
|
5153 | ||||
|
5154 | @classmethod | |||
5149 | def create(cls, file_uid, filename, file_hash, file_size, file_display_name='', |
|
5155 | def create(cls, file_uid, filename, file_hash, file_size, file_display_name='', | |
5150 | file_description='', enabled=True, hidden=False, check_acl=True, |
|
5156 | file_description='', enabled=True, hidden=False, check_acl=True, | |
5151 | user_id=None, scope_user_id=None, scope_repo_id=None, scope_repo_group_id=None): |
|
5157 | user_id=None, scope_user_id=None, scope_repo_id=None, scope_repo_group_id=None): | |
@@ -5176,6 +5182,19 b' class FileStore(Base, BaseModel):' | |||||
5176 | return |
|
5182 | return | |
5177 |
|
5183 | |||
5178 | for section, key, value, value_type in args: |
|
5184 | for section, key, value, value_type in args: | |
|
5185 | has_key = FileStoreMetadata().query() \ | |||
|
5186 | .filter(FileStoreMetadata.file_store_id == file_store.file_store_id) \ | |||
|
5187 | .filter(FileStoreMetadata.file_store_meta_section == section) \ | |||
|
5188 | .filter(FileStoreMetadata.file_store_meta_key == key) \ | |||
|
5189 | .scalar() | |||
|
5190 | if has_key: | |||
|
5191 | msg = 'key `{}` already defined under section `{}` for this file.'\ | |||
|
5192 | .format(key, section) | |||
|
5193 | raise ArtifactMetadataDuplicate(msg, err_section=section, err_key=key) | |||
|
5194 | ||||
|
5195 | # NOTE(marcink): raises ArtifactMetadataBadValueType | |||
|
5196 | FileStoreMetadata.valid_value_type(value_type) | |||
|
5197 | ||||
5179 | meta_entry = FileStoreMetadata() |
|
5198 | meta_entry = FileStoreMetadata() | |
5180 | meta_entry.file_store = file_store |
|
5199 | meta_entry.file_store = file_store | |
5181 | meta_entry.file_store_meta_section = section |
|
5200 | meta_entry.file_store_meta_section = section | |
@@ -5185,8 +5204,12 b' class FileStore(Base, BaseModel):' | |||||
5185 |
|
5204 | |||
5186 | Session().add(meta_entry) |
|
5205 | Session().add(meta_entry) | |
5187 |
|
5206 | |||
|
5207 | try: | |||
5188 | if commit: |
|
5208 | if commit: | |
5189 | Session().commit() |
|
5209 | Session().commit() | |
|
5210 | except IntegrityError: | |||
|
5211 | Session().rollback() | |||
|
5212 | raise ArtifactMetadataDuplicate('Duplicate section/key found for this file.') | |||
5190 |
|
5213 | |||
5191 | @classmethod |
|
5214 | @classmethod | |
5192 | def bump_access_counter(cls, file_uid, commit=True): |
|
5215 | def bump_access_counter(cls, file_uid, commit=True): | |
@@ -5239,20 +5262,28 b' class FileStoreMetadata(Base, BaseModel)' | |||||
5239 |
|
5262 | |||
5240 | file_store = relationship('FileStore', lazy='joined') |
|
5263 | file_store = relationship('FileStore', lazy='joined') | |
5241 |
|
5264 | |||
|
5265 | @classmethod | |||
|
5266 | def valid_value_type(cls, value): | |||
|
5267 | if value.split('.')[0] not in cls.SETTINGS_TYPES: | |||
|
5268 | raise ArtifactMetadataBadValueType( | |||
|
5269 | 'value_type must be one of %s got %s' % (cls.SETTINGS_TYPES.keys(), value)) | |||
|
5270 | ||||
5242 | @hybrid_property |
|
5271 | @hybrid_property | |
5243 | def file_store_meta_value(self): |
|
5272 | def file_store_meta_value(self): | |
5244 | v = self._file_store_meta_value |
|
5273 | val = self._file_store_meta_value | |
5245 | _type = self._file_store_meta_value |
|
5274 | ||
5246 | if _type: |
|
5275 | if self._file_store_meta_value_type: | |
5247 | # e.g unicode.encrypted == unicode |
|
5276 | # e.g unicode.encrypted == unicode | |
5248 | _type = self._file_store_meta_value.split('.')[0] |
|
5277 | _type = self._file_store_meta_value_type.split('.')[0] | |
5249 | # decode the encrypted value |
|
5278 | # decode the encrypted value if it's encrypted field type | |
5250 | if '.encrypted' in self._file_store_meta_value_type: |
|
5279 | if '.encrypted' in self._file_store_meta_value_type: | |
5251 | cipher = EncryptedTextValue() |
|
5280 | cipher = EncryptedTextValue() | |
5252 | v = safe_unicode(cipher.process_result_value(v, None)) |
|
5281 | val = safe_unicode(cipher.process_result_value(val, None)) | |
5253 |
|
5282 | # do final type conversion | ||
5254 | converter = self.SETTINGS_TYPES.get(_type) or self.SETTINGS_TYPES['unicode'] |
|
5283 | converter = self.SETTINGS_TYPES.get(_type) or self.SETTINGS_TYPES['unicode'] | |
5255 |
|
|
5284 | val = converter(val) | |
|
5285 | ||||
|
5286 | return val | |||
5256 |
|
5287 | |||
5257 | @file_store_meta_value.setter |
|
5288 | @file_store_meta_value.setter | |
5258 | def file_store_meta_value(self, val): |
|
5289 | def file_store_meta_value(self, val): | |
@@ -5270,11 +5301,19 b' class FileStoreMetadata(Base, BaseModel)' | |||||
5270 | @file_store_meta_value_type.setter |
|
5301 | @file_store_meta_value_type.setter | |
5271 | def file_store_meta_value_type(self, val): |
|
5302 | def file_store_meta_value_type(self, val): | |
5272 | # e.g unicode.encrypted |
|
5303 | # e.g unicode.encrypted | |
5273 | if val.split('.')[0] not in self.SETTINGS_TYPES: |
|
5304 | self.valid_value_type(val) | |
5274 | raise Exception('type must be one of %s got %s' |
|
|||
5275 | % (self.SETTINGS_TYPES.keys(), val)) |
|
|||
5276 | self._file_store_meta_value_type = val |
|
5305 | self._file_store_meta_value_type = val | |
5277 |
|
5306 | |||
|
5307 | def __json__(self): | |||
|
5308 | data = { | |||
|
5309 | 'artifact': self.file_store.file_uid, | |||
|
5310 | 'section': self.file_store_meta_section, | |||
|
5311 | 'key': self.file_store_meta_key, | |||
|
5312 | 'value': self.file_store_meta_value, | |||
|
5313 | } | |||
|
5314 | ||||
|
5315 | return data | |||
|
5316 | ||||
5278 | def __repr__(self): |
|
5317 | def __repr__(self): | |
5279 | return '<%s[%s]%s=>%s]>' % (self.__class__.__name__, self.file_store_meta_section, |
|
5318 | return '<%s[%s]%s=>%s]>' % (self.__class__.__name__, self.file_store_meta_section, | |
5280 | self.file_store_meta_key, self.file_store_meta_value) |
|
5319 | self.file_store_meta_key, self.file_store_meta_value) |
General Comments 0
You need to be logged in to leave comments.
Login now