general cleanup; move binding_filler helper
This commit is contained in:
		
							parent
							
								
									af40f24dd8
								
							
						
					
					
						commit
						69443d7a8c
					
				
					 8 changed files with 53 additions and 40 deletions
				
			
		|  | @ -182,10 +182,10 @@ def post_login(): | ||||||
| 
 | 
 | ||||||
|     username = request.form['username'] |     username = request.form['username'] | ||||||
|     password = request.form['password'] |     password = request.form['password'] | ||||||
|     user = P.get_user(username=username) |  | ||||||
|     try: |     try: | ||||||
|  |         user = P.get_user(username=username) | ||||||
|         user = P.login(user.id, password) |         user = P.login(user.id, password) | ||||||
|     except exceptions.WrongLogin: |     except (exceptions.NoSuchUser, exceptions.WrongLogin): | ||||||
|         flask.abort(422, 'Wrong login.') |         flask.abort(422, 'Wrong login.') | ||||||
|     session = sessions.Session(request, user) |     session = sessions.Session(request, user) | ||||||
|     session_manager.add(session) |     session_manager.add(session) | ||||||
|  |  | ||||||
|  | @ -33,6 +33,9 @@ class UserExists(Exception): | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| # TAG ERRORS | # TAG ERRORS | ||||||
|  | class CantSynonymSelf(Exception): | ||||||
|  |     pass | ||||||
|  | 
 | ||||||
| class RecursiveGrouping(Exception): | class RecursiveGrouping(Exception): | ||||||
|     pass |     pass | ||||||
| 
 | 
 | ||||||
|  | @ -42,9 +45,6 @@ class TagTooLong(Exception): | ||||||
| class TagTooShort(Exception): | class TagTooShort(Exception): | ||||||
|     pass |     pass | ||||||
| 
 | 
 | ||||||
| class CantSynonymSelf(Exception): |  | ||||||
|     pass |  | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
| # USER ERRORS | # USER ERRORS | ||||||
| class InvalidUsernameChars(Exception): | class InvalidUsernameChars(Exception): | ||||||
|  |  | ||||||
							
								
								
									
										19
									
								
								helpers.py
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								helpers.py
									
									
									
									
									
								
							|  | @ -50,6 +50,25 @@ def album_zip_filenames(album, recursive=True): | ||||||
| 
 | 
 | ||||||
|     return arcnames |     return arcnames | ||||||
| 
 | 
 | ||||||
|  | def binding_filler(column_names, values, require_all=True): | ||||||
|  |     ''' | ||||||
|  |     Manually aligning question marks and bindings is annoying. | ||||||
|  |     Given the table's column names and a dictionary of {column: value}, | ||||||
|  |     return the question marks and the list of bindings in the right order. | ||||||
|  |     ''' | ||||||
|  |     values = values.copy() | ||||||
|  |     for column in column_names: | ||||||
|  |         if column in values: | ||||||
|  |             continue | ||||||
|  |         if require_all: | ||||||
|  |             raise ValueError('Missing column "%s"' % column) | ||||||
|  |         else: | ||||||
|  |             values.setdefault(column, None) | ||||||
|  |     qmarks = '?' * len(column_names) | ||||||
|  |     qmarks = ', '.join(qmarks) | ||||||
|  |     bindings = [values[column] for column in column_names] | ||||||
|  |     return (qmarks, bindings) | ||||||
|  | 
 | ||||||
| def chunk_sequence(sequence, chunk_length, allow_incomplete=True): | def chunk_sequence(sequence, chunk_length, allow_incomplete=True): | ||||||
|     ''' |     ''' | ||||||
|     Given a sequence, divide it into sequences of length `chunk_length`. |     Given a sequence, divide it into sequences of length `chunk_length`. | ||||||
|  |  | ||||||
							
								
								
									
										23
									
								
								objects.py
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								objects.py
									
									
									
									
									
								
							|  | @ -281,23 +281,24 @@ class Photo(ObjectBase): | ||||||
|         if isinstance(row_tuple, (list, tuple)): |         if isinstance(row_tuple, (list, tuple)): | ||||||
|             row_tuple = {constants.SQL_PHOTO_COLUMNS[index]: value for (index, value) in enumerate(row_tuple)} |             row_tuple = {constants.SQL_PHOTO_COLUMNS[index]: value for (index, value) in enumerate(row_tuple)} | ||||||
| 
 | 
 | ||||||
|         self.id = row_tuple['id'] |         self.real_filepath = helpers.normalize_filepath(row_tuple['filepath'], allowed=':\\/') | ||||||
|         self.real_filepath = row_tuple['filepath'] |  | ||||||
|         self.real_filepath = helpers.normalize_filepath(self.real_filepath, allowed=':\\/') |  | ||||||
|         self.real_path = pathclass.Path(self.real_filepath) |         self.real_path = pathclass.Path(self.real_filepath) | ||||||
|         self.filepath = row_tuple['override_filename'] or self.real_filepath | 
 | ||||||
|         self.basename = row_tuple['override_filename'] or os.path.basename(self.real_filepath) |         self.id = row_tuple['id'] | ||||||
|  |         self.created = row_tuple['created'] | ||||||
|  |         self.author_id = row_tuple['author_id'] | ||||||
|  |         self.filepath = row_tuple['override_filename'] or self.real_path.absolute_path | ||||||
|  |         self.basename = row_tuple['override_filename'] or self.real_path.basename | ||||||
|         self.extension = row_tuple['extension'] |         self.extension = row_tuple['extension'] | ||||||
|         self.width = row_tuple['width'] |         self.tagged_at = row_tuple['tagged_at'] | ||||||
|         self.height = row_tuple['height'] | 
 | ||||||
|         self.ratio = row_tuple['ratio'] |  | ||||||
|         self.area = row_tuple['area'] |         self.area = row_tuple['area'] | ||||||
|         self.bytes = row_tuple['bytes'] |         self.bytes = row_tuple['bytes'] | ||||||
|         self.duration = row_tuple['duration'] |         self.duration = row_tuple['duration'] | ||||||
|         self.created = row_tuple['created'] |         self.width = row_tuple['width'] | ||||||
|  |         self.height = row_tuple['height'] | ||||||
|  |         self.ratio = row_tuple['ratio'] | ||||||
|         self.thumbnail = row_tuple['thumbnail'] |         self.thumbnail = row_tuple['thumbnail'] | ||||||
|         self.tagged_at = row_tuple['tagged_at'] |  | ||||||
|         self.author_id = row_tuple['author_id'] |  | ||||||
| 
 | 
 | ||||||
|     def __reinit__(self): |     def __reinit__(self): | ||||||
|         ''' |         ''' | ||||||
|  |  | ||||||
|  | @ -124,25 +124,6 @@ def _helper_filenamefilter(subject, terms): | ||||||
|     basename = subject.lower() |     basename = subject.lower() | ||||||
|     return all(term in basename for term in terms) |     return all(term in basename for term in terms) | ||||||
| 
 | 
 | ||||||
| def binding_filler(column_names, values, require_all=True): |  | ||||||
|     ''' |  | ||||||
|     Manually aligning question marks and bindings is annoying. |  | ||||||
|     Given the table's column names and a dictionary of {column: value}, |  | ||||||
|     return the question marks and the list of bindings in the right order. |  | ||||||
|     ''' |  | ||||||
|     values = values.copy() |  | ||||||
|     for column in column_names: |  | ||||||
|         if column in values: |  | ||||||
|             continue |  | ||||||
|         if require_all: |  | ||||||
|             raise ValueError('Missing column "%s"' % column) |  | ||||||
|         else: |  | ||||||
|             values.setdefault(column, None) |  | ||||||
|     qmarks = '?' * len(column_names) |  | ||||||
|     qmarks = ', '.join(qmarks) |  | ||||||
|     bindings = [values[column] for column in column_names] |  | ||||||
|     return (qmarks, bindings) |  | ||||||
| 
 |  | ||||||
| def operate(operand_stack, operator_stack): | def operate(operand_stack, operator_stack): | ||||||
|     #print('before:', operand_stack, operator_stack) |     #print('before:', operand_stack, operator_stack) | ||||||
|     operator = operator_stack.pop() |     operator = operator_stack.pop() | ||||||
|  | @ -379,7 +360,7 @@ class PDBAlbumMixin: | ||||||
|             'associated_directory': associated_directory, |             'associated_directory': associated_directory, | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         (qmarks, bindings) = binding_filler(constants.SQL_ALBUM_COLUMNS, data) |         (qmarks, bindings) = helpers.binding_filler(constants.SQL_ALBUM_COLUMNS, data) | ||||||
|         query = 'INSERT INTO albums VALUES(%s)' % qmarks |         query = 'INSERT INTO albums VALUES(%s)' % qmarks | ||||||
|         self.cur.execute(query, bindings) |         self.cur.execute(query, bindings) | ||||||
| 
 | 
 | ||||||
|  | @ -496,7 +477,7 @@ class PDBPhotoMixin: | ||||||
|             'thumbnail': None, |             'thumbnail': None, | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         (qmarks, bindings) = binding_filler(constants.SQL_PHOTO_COLUMNS, data) |         (qmarks, bindings) = helpers.binding_filler(constants.SQL_PHOTO_COLUMNS, data) | ||||||
|         query = 'INSERT INTO photos VALUES(%s)' % qmarks |         query = 'INSERT INTO photos VALUES(%s)' % qmarks | ||||||
|         self.cur.execute(query, bindings) |         self.cur.execute(query, bindings) | ||||||
|         photo = objects.Photo(self, data) |         photo = objects.Photo(self, data) | ||||||
|  | @ -937,7 +918,7 @@ class PDBUserMixin: | ||||||
|             'created': created, |             'created': created, | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         (qmarks, bindings) = binding_filler(constants.SQL_USER_COLUMNS, data) |         (qmarks, bindings) = helpers.binding_filler(constants.SQL_USER_COLUMNS, data) | ||||||
|         query = 'INSERT INTO users VALUES(%s)' % qmarks |         query = 'INSERT INTO users VALUES(%s)' % qmarks | ||||||
|         self.cur.execute(query, bindings) |         self.cur.execute(query, bindings) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -53,7 +53,7 @@ button | ||||||
|         <div id="login_register_box"> |         <div id="login_register_box"> | ||||||
|         <form id="login_form" action="/login" method="post"> |         <form id="login_form" action="/login" method="post"> | ||||||
|             <span>Log in</span> |             <span>Log in</span> | ||||||
|             <input type="text" name="username" placeholder="username"> |             <input type="text" name="username" placeholder="username" autofocus> | ||||||
|             <input type="password" name="password" placeholder="password"> |             <input type="password" name="password" placeholder="password"> | ||||||
|             <button type="submit">Log in</button> |             <button type="submit">Log in</button> | ||||||
|         </form> |         </form> | ||||||
|  |  | ||||||
|  | @ -215,22 +215,34 @@ function move_hoverzoom(event) | ||||||
| { | { | ||||||
|     var x; |     var x; | ||||||
|     var y; |     var y; | ||||||
|  | 
 | ||||||
|  |     // Adding 5% to perceived position gives us a bit of padding around the image, | ||||||
|  |     // so you don't need to navigate a 1px line to see the edge. | ||||||
|  |     // We first subtract half of the image dimensions so that the 5% is applied | ||||||
|  |     // to both left and right. Otherwise 105% of 0 is still 0 which doesn't | ||||||
|  |     // apply padding on the left. | ||||||
|     var mouse_x = event.offsetX; |     var mouse_x = event.offsetX; | ||||||
|     mouse_x -= (photo_img_holder.offsetWidth / 2); |     mouse_x -= (photo_img_holder.offsetWidth / 2); | ||||||
|     mouse_x *= 1.05; |     mouse_x *= 1.05; | ||||||
|     mouse_x += (photo_img_holder.offsetWidth / 2); |     mouse_x += (photo_img_holder.offsetWidth / 2); | ||||||
|  | 
 | ||||||
|     var mouse_y = event.offsetY; |     var mouse_y = event.offsetY; | ||||||
|     mouse_y -= (photo_img_holder.offsetHeight / 2); |     mouse_y -= (photo_img_holder.offsetHeight / 2); | ||||||
|     mouse_y *= 1.05; |     mouse_y *= 1.05; | ||||||
|     mouse_y += (photo_img_holder.offsetHeight / 2); |     mouse_y += (photo_img_holder.offsetHeight / 2); | ||||||
|  | 
 | ||||||
|     if (photo_img.naturalWidth < photo_img_holder.offsetWidth) |     if (photo_img.naturalWidth < photo_img_holder.offsetWidth) | ||||||
|     { |     { | ||||||
|  |         // If the image is smaller than the frame, just center it | ||||||
|         x = (photo_img.naturalWidth - photo_img_holder.offsetWidth) / 2; |         x = (photo_img.naturalWidth - photo_img_holder.offsetWidth) / 2; | ||||||
|     } |     } | ||||||
|     else |     else | ||||||
|     { |     { | ||||||
|  |         // Take the amount of movement necessary (frame width - image width) | ||||||
|  |         // times our distance across the image as a percentage. | ||||||
|         x = (photo_img.naturalWidth - photo_img_holder.offsetWidth) * (mouse_x / photo_img_holder.offsetWidth); |         x = (photo_img.naturalWidth - photo_img_holder.offsetWidth) * (mouse_x / photo_img_holder.offsetWidth); | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|     if (photo_img.naturalHeight < photo_img_holder.offsetHeight) |     if (photo_img.naturalHeight < photo_img_holder.offsetHeight) | ||||||
|     { |     { | ||||||
|         y = (photo_img.naturalHeight - photo_img_holder.offsetHeight) / 2; |         y = (photo_img.naturalHeight - photo_img_holder.offsetHeight) / 2; | ||||||
|  |  | ||||||
|  | @ -37,7 +37,7 @@ | ||||||
|         </a> |         </a> | ||||||
|     </div> |     </div> | ||||||
|     <div class="photo_card_grid_info"> |     <div class="photo_card_grid_info"> | ||||||
|         <a target="_blank" href="/photo/{{photo.id}}">{{photo.basename}}</a> |         <a target="_blank" href="/photo/{{photo.id}}" style="word-break:break-all">{{photo.basename}}</a> | ||||||
|         <span class="photo_card_grid_file_metadata"> |         <span class="photo_card_grid_file_metadata"> | ||||||
|         {% if photo.width %} |         {% if photo.width %} | ||||||
|             {{photo.width}}x{{photo.height}}, |             {{photo.width}}x{{photo.height}}, | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue