checkpoint
This commit is contained in:
		
							parent
							
								
									df028c2354
								
							
						
					
					
						commit
						45a8a8ccc5
					
				
					 11 changed files with 134 additions and 70 deletions
				
			
		|  | @ -3,6 +3,7 @@ from flask import request | ||||||
| import functools | import functools | ||||||
| import time | import time | ||||||
| import uuid | import uuid | ||||||
|  | import warnings | ||||||
| 
 | 
 | ||||||
| def _generate_session_token(): | def _generate_session_token(): | ||||||
|     token = str(uuid.uuid4()) |     token = str(uuid.uuid4()) | ||||||
|  | @ -38,7 +39,7 @@ def not_implemented(function): | ||||||
| 
 | 
 | ||||||
| def time_me(function): | def time_me(function): | ||||||
|     ''' |     ''' | ||||||
|     Decorator. After the function is run, print the elapsed time. |     After the function is run, print the elapsed time. | ||||||
|     ''' |     ''' | ||||||
|     @functools.wraps(function) |     @functools.wraps(function) | ||||||
|     def timed_function(*args, **kwargs): |     def timed_function(*args, **kwargs): | ||||||
|  |  | ||||||
|  | @ -194,6 +194,7 @@ def get_album_html(albumid): | ||||||
|         'album.html', |         'album.html', | ||||||
|         album=album, |         album=album, | ||||||
|         photos=album['photos'], |         photos=album['photos'], | ||||||
|  |         view=request.args.get('view', 'grid'), | ||||||
|     ) |     ) | ||||||
|     return response |     return response | ||||||
| 
 | 
 | ||||||
|  | @ -403,6 +404,9 @@ def get_search_core(): | ||||||
| 
 | 
 | ||||||
|     view = request.args.get('view', 'grid') |     view = request.args.get('view', 'grid') | ||||||
|     search_kwargs['view'] = view |     search_kwargs['view'] = view | ||||||
|  |     search_kwargs['extension'] = extension_string | ||||||
|  |     search_kwargs['extension_not'] = extension_not_string | ||||||
|  |     search_kwargs['mimetype'] = mimetype_string | ||||||
| 
 | 
 | ||||||
|     final_results = { |     final_results = { | ||||||
|         'next_page_url': next_page_url, |         'next_page_url': next_page_url, | ||||||
|  | @ -604,4 +608,5 @@ def post_edit_tags(): | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| if __name__ == '__main__': | if __name__ == '__main__': | ||||||
|     site.run(threaded=True) |     #site.run(threaded=True) | ||||||
|  |     pass | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| from gevent import monkey | import gevent.monkey | ||||||
| monkey.patch_all() | gevent.monkey.patch_all() | ||||||
| 
 | 
 | ||||||
| import etiquette | import etiquette | ||||||
| import gevent.pywsgi | import gevent.pywsgi | ||||||
|  | @ -13,13 +13,17 @@ else: | ||||||
| 
 | 
 | ||||||
| if port == 443: | if port == 443: | ||||||
|     http = gevent.pywsgi.WSGIServer( |     http = gevent.pywsgi.WSGIServer( | ||||||
|         ('', port), |         listener=('', port), | ||||||
|         etiquette.site, |         application=etiquette.site, | ||||||
|         keyfile='https\\etiquette.key', |         keyfile='C:\\git\\etiquette\\etiquette\\https\\etiquette.key', | ||||||
|         certfile='https\\etiquette.crt', |         certfile='C:\\git\\etiquette\\etiquette\\https\\etiquette.crt', | ||||||
|     ) |     ) | ||||||
| else: | else: | ||||||
|     http = gevent.wsgi.WSGIServer(('', port), etiquette.site) |     http = gevent.pywsgi.WSGIServer( | ||||||
|  |         listener=('', port), | ||||||
|  |         application=etiquette.site, | ||||||
|  |     ) | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| print('Starting server') | print('Starting server') | ||||||
| http.serve_forever() | http.serve_forever() | ||||||
|  | @ -44,7 +44,7 @@ except converter.ffmpeg.FFMpegError: | ||||||
| 
 | 
 | ||||||
| logging.basicConfig(level=logging.DEBUG) | logging.basicConfig(level=logging.DEBUG) | ||||||
| log = logging.getLogger(__name__) | log = logging.getLogger(__name__) | ||||||
| logging.getLogger("PIL.PngImagePlugin").setLevel(logging.WARNING) | logging.getLogger('PIL.PngImagePlugin').setLevel(logging.WARNING) | ||||||
| 
 | 
 | ||||||
| SQL_LASTID_COLUMNS = [ | SQL_LASTID_COLUMNS = [ | ||||||
|     'table', |     'table', | ||||||
|  | @ -55,7 +55,7 @@ SQL_ALBUM_COLUMNS = [ | ||||||
|     'id', |     'id', | ||||||
|     'title', |     'title', | ||||||
|     'description', |     'description', | ||||||
|     'associated_directory' |     'associated_directory', | ||||||
| ] | ] | ||||||
| SQL_PHOTO_COLUMNS = [ | SQL_PHOTO_COLUMNS = [ | ||||||
|     'id', |     'id', | ||||||
|  | @ -1576,14 +1576,18 @@ class Album(ObjectBase, GroupableMixin): | ||||||
|             log.debug('Committing - add photo to album') |             log.debug('Committing - add photo to album') | ||||||
|             self.photodb.commit() |             self.photodb.commit() | ||||||
| 
 | 
 | ||||||
|     def add_tag_to_all(self, tag, nested_children=True): |     def add_tag_to_all(self, tag, nested_children=True, commit=True): | ||||||
|         tag = self.photodb.get_tag(tag) |         tag = self.photodb.get_tag(tag) | ||||||
|         if nested_children: |         if nested_children: | ||||||
|             photos = self.walk_photos() |             photos = self.walk_photos() | ||||||
|         else: |         else: | ||||||
|             photos = self.photos() |             photos = self.photos() | ||||||
|         for photo in photos: |         for photo in photos: | ||||||
|             photo.add_tag(tag) |             photo.add_tag(tag, commit=False) | ||||||
|  | 
 | ||||||
|  |         if commit: | ||||||
|  |             log.debug('Committing - add tag to all') | ||||||
|  |             self.photodb.commit() | ||||||
| 
 | 
 | ||||||
|     def delete(self, delete_children=False, commit=True): |     def delete(self, delete_children=False, commit=True): | ||||||
|         log.debug('Deleting album {album:r}'.format(album=self)) |         log.debug('Deleting album {album:r}'.format(album=self)) | ||||||
|  | @ -1673,8 +1677,12 @@ class Photo(ObjectBase): | ||||||
|         self.duration = row_tuple[SQL_PHOTO['duration']] |         self.duration = row_tuple[SQL_PHOTO['duration']] | ||||||
|         self.created = row_tuple[SQL_PHOTO['created']] |         self.created = row_tuple[SQL_PHOTO['created']] | ||||||
|         self.thumbnail = row_tuple[SQL_PHOTO['thumbnail']] |         self.thumbnail = row_tuple[SQL_PHOTO['thumbnail']] | ||||||
|  |         self.real_path = pathclass.Path(self.real_filepath) | ||||||
| 
 | 
 | ||||||
|     def __reinit__(self): |     def __reinit__(self): | ||||||
|  |         ''' | ||||||
|  |         Reload the row from the database and do __init__ with them. | ||||||
|  |         ''' | ||||||
|         self.photodb.cur.execute('SELECT * FROM photos WHERE id == ?', [self.id]) |         self.photodb.cur.execute('SELECT * FROM photos WHERE id == ?', [self.id]) | ||||||
|         row = self.photodb.cur.fetchone() |         row = self.photodb.cur.fetchone() | ||||||
|         self.__init__(self.photodb, row) |         self.__init__(self.photodb, row) | ||||||
|  | @ -1915,45 +1923,51 @@ class Photo(ObjectBase): | ||||||
|         If `move` is True, allow this operation to move the file. |         If `move` is True, allow this operation to move the file. | ||||||
|         Otherwise, slashes will be considered an error. |         Otherwise, slashes will be considered an error. | ||||||
|         ''' |         ''' | ||||||
|         current_dir = os.path.normcase(os.path.dirname(self.real_filepath)) |         old_path = self.real_path | ||||||
|  |         old_path.correct_case() | ||||||
|  | 
 | ||||||
|         new_filename = normalize_filepath(new_filename) |         new_filename = normalize_filepath(new_filename) | ||||||
|         new_dir = os.path.normcase(os.path.dirname(new_filename)) |         if os.path.dirname(new_filename) == '': | ||||||
|         if new_dir == '': |             new_path = old_path.parent.with_child(new_filename) | ||||||
|             new_dir = current_dir |  | ||||||
|             new_abspath = os.path.join(new_dir, new_filename) |  | ||||||
|         else: |         else: | ||||||
|             new_abspath = os.path.abspath(new_filename) |             new_path = pathclass.Path(new_filename) | ||||||
|             new_dir = os.path.normcase(os.path.dirname(new_abspath)) |         new_path.correct_case() | ||||||
|         if (new_dir != current_dir) and not move: | 
 | ||||||
|  |         log.debug(old_path) | ||||||
|  |         log.debug(new_path) | ||||||
|  |         if (new_path.parent != old_path.parent) and not move: | ||||||
|             raise ValueError('Cannot move the file without param move=True') |             raise ValueError('Cannot move the file without param move=True') | ||||||
| 
 | 
 | ||||||
|         os.makedirs(new_dir, exist_ok=True) |         if new_path.absolute_path == old_path.absolute_path: | ||||||
|         new_basename = os.path.basename(new_abspath) |             raise ValueError('The new and old names are the same') | ||||||
| 
 | 
 | ||||||
|         new_abs_norm = os.path.normcase(new_abspath) |         os.makedirs(new_path.parent.absolute_path, exist_ok=True) | ||||||
|         current_norm = os.path.normcase(self.real_filepath) |  | ||||||
| 
 | 
 | ||||||
|         if new_abs_norm != current_norm: |         if new_path != old_path: | ||||||
|  |             # This is different than the absolute == absolute check above, because this normalizes | ||||||
|  |             # the paths. It's possible on case-insensitive systems to have the paths point to the | ||||||
|  |             # same place while being differently cased, thus we couldn't make the intermediate link. | ||||||
|             try: |             try: | ||||||
|                 os.link(self.real_filepath, new_abspath) |                 os.link(old_path.absolute_path, new_path.absolute_path) | ||||||
|             except OSError: |             except OSError: | ||||||
|                 # Happens when trying to hardlink across disks |                 spinal.copy_file(old_path, new_path) | ||||||
|                 spinal.copy_file(self.real_filepath, new_abspath) |  | ||||||
| 
 | 
 | ||||||
|         self.photodb.cur.execute( |         self.photodb.cur.execute( | ||||||
|             'UPDATE photos SET filepath = ? WHERE filepath == ?', |             'UPDATE photos SET filepath = ? WHERE filepath == ?', | ||||||
|             [new_abspath, self.real_filepath] |             [new_path.absolute_path, old_path.absolute_path] | ||||||
|         ) |         ) | ||||||
| 
 | 
 | ||||||
|         if commit: |         if commit: | ||||||
|             if new_abs_norm != current_norm: |             if new_path == old_path: | ||||||
|                 os.remove(self.real_filepath) |                 # If they are equivalent but differently cased paths, just rename. | ||||||
|  |                 os.rename(old_path.absolute_path, new_path.absolute_path) | ||||||
|             else: |             else: | ||||||
|                 os.rename(self.real_filepath, new_abspath) |                 # Delete the original hardlink or copy. | ||||||
|  |                 os.remove(old_path.absolute_path) | ||||||
|             log.debug('Committing - rename file') |             log.debug('Committing - rename file') | ||||||
|             self.photodb.commit() |             self.photodb.commit() | ||||||
|         else: |         else: | ||||||
|             queue_action = {'action': os.remove, 'args': [self.real_filepath]} |             queue_action = {'action': os.remove, 'args': [old_path.absolute_path]} | ||||||
|             self.photodb.on_commit_queue.append(queue_action) |             self.photodb.on_commit_queue.append(queue_action) | ||||||
|          |          | ||||||
|         self.__reinit__() |         self.__reinit__() | ||||||
|  |  | ||||||
|  | @ -6,7 +6,7 @@ | ||||||
|     <title>Album {{album["title"]}}</title> |     <title>Album {{album["title"]}}</title> | ||||||
|     <meta charset="UTF-8"> |     <meta charset="UTF-8"> | ||||||
|     <link rel="stylesheet" href="/static/common.css"> |     <link rel="stylesheet" href="/static/common.css"> | ||||||
| </head> | 
 | ||||||
| <style> | <style> | ||||||
| #content_body | #content_body | ||||||
| { | { | ||||||
|  | @ -14,6 +14,8 @@ | ||||||
|     display: block; |     display: block; | ||||||
| } | } | ||||||
| </style> | </style> | ||||||
|  | </head> | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| <body> | <body> | ||||||
| {{header.make_header()}} | {{header.make_header()}} | ||||||
|  | @ -44,14 +46,13 @@ | ||||||
|     <h3>Photos</h3> |     <h3>Photos</h3> | ||||||
|     <ul> |     <ul> | ||||||
|         {% for photo in photos %} |         {% for photo in photos %} | ||||||
|         {{photo_card.create_photo_card(photo)}} |         {{photo_card.create_photo_card(photo, view=view)}} | ||||||
|         {% endfor %} |         {% endfor %} | ||||||
|     </ul> |     </ul> | ||||||
|     {% endif %} |     {% endif %} | ||||||
| </div> | </div> | ||||||
| </body> | </body> | ||||||
| 
 | 
 | ||||||
| </html> |  | ||||||
| 
 | 
 | ||||||
| <script type="text/javascript"> | <script type="text/javascript"> | ||||||
| function submit_tag(callback) | function submit_tag(callback) | ||||||
|  | @ -60,3 +61,4 @@ function submit_tag(callback) | ||||||
|     add_tag_box.value = ""; |     add_tag_box.value = ""; | ||||||
| } | } | ||||||
| </script> | </script> | ||||||
|  | </html> | ||||||
|  | @ -5,13 +5,15 @@ | ||||||
|     <title>Albums</title> |     <title>Albums</title> | ||||||
|     <meta charset="UTF-8"> |     <meta charset="UTF-8"> | ||||||
|     <link rel="stylesheet" href="/static/common.css"> |     <link rel="stylesheet" href="/static/common.css"> | ||||||
| </head> | 
 | ||||||
| <style> | <style> | ||||||
| #content_body | #content_body | ||||||
| { | { | ||||||
|     flex-direction: column; |     flex-direction: column; | ||||||
| } | } | ||||||
| </style> | </style> | ||||||
|  | </head> | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| <body> | <body> | ||||||
| {{header.make_header()}} | {{header.make_header()}} | ||||||
|  | @ -26,8 +28,8 @@ | ||||||
|     {% endfor %} |     {% endfor %} | ||||||
| </div> | </div> | ||||||
| </body> | </body> | ||||||
| </html> |  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| <script type="text/javascript"> | <script type="text/javascript"> | ||||||
| </script> | </script> | ||||||
|  | </html> | ||||||
|  |  | ||||||
|  | @ -9,7 +9,7 @@ | ||||||
|     {% set filename = photo["id"] + "." + photo["extension"] %} |     {% set filename = photo["id"] + "." + photo["extension"] %} | ||||||
|     {% set link = "/file/" + filename %} |     {% set link = "/file/" + filename %} | ||||||
|     {% set mimetype=photo["mimetype"] %} |     {% set mimetype=photo["mimetype"] %} | ||||||
| </head> | 
 | ||||||
| <style> | <style> | ||||||
| #content_body | #content_body | ||||||
| { | { | ||||||
|  | @ -83,6 +83,8 @@ | ||||||
|     width: 100%; |     width: 100%; | ||||||
| } | } | ||||||
| </style> | </style> | ||||||
|  | </head> | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| <body> | <body> | ||||||
| {{header.make_header()}} | {{header.make_header()}} | ||||||
|  | @ -150,7 +152,7 @@ | ||||||
| </div> | </div> | ||||||
| </div> | </div> | ||||||
| </body> | </body> | ||||||
| </html> | 
 | ||||||
| 
 | 
 | ||||||
| <script type="text/javascript"> | <script type="text/javascript"> | ||||||
| var add_tag_box = document.getElementById('add_tag_textbox'); | var add_tag_box = document.getElementById('add_tag_textbox'); | ||||||
|  | @ -186,6 +188,7 @@ function disable_hoverzoom() | ||||||
|     div.style.backgroundImage = "none"; |     div.style.backgroundImage = "none"; | ||||||
|     div.onmousemove = null; |     div.onmousemove = null; | ||||||
|     div.onclick = null; |     div.onclick = null; | ||||||
|  |     add_tag_box.focus(); | ||||||
| } | } | ||||||
| function toggle_hoverzoom() | function toggle_hoverzoom() | ||||||
| { | { | ||||||
|  | @ -199,30 +202,39 @@ function toggle_hoverzoom() | ||||||
|         enable_hoverzoom(); |         enable_hoverzoom(); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | photo_img_holder = document.getElementById("photo_img_holder"); | ||||||
|  | photo_img = document.getElementById("photo_img"); | ||||||
| function move_hoverzoom(event) | function move_hoverzoom(event) | ||||||
| { | { | ||||||
|     div = document.getElementById("photo_img_holder"); |  | ||||||
|     img = document.getElementById("photo_img"); |  | ||||||
|     var x; |     var x; | ||||||
|     var y; |     var y; | ||||||
|     if (img.naturalWidth < div.offsetWidth) |     var mouse_x = event.offsetX; | ||||||
|  |     mouse_x -= (photo_img_holder.offsetWidth / 2); | ||||||
|  |     mouse_x *= 1.05; | ||||||
|  |     mouse_x += (photo_img_holder.offsetWidth / 2); | ||||||
|  |     var mouse_y = event.offsetY; | ||||||
|  |     mouse_y -= (photo_img_holder.offsetHeight / 2); | ||||||
|  |     mouse_y *= 1.05; | ||||||
|  |     mouse_y += (photo_img_holder.offsetHeight / 2); | ||||||
|  |     if (photo_img.naturalWidth < photo_img_holder.offsetWidth) | ||||||
|     { |     { | ||||||
|         x = (img.naturalWidth - div.offsetWidth) / 2; |         x = (photo_img.naturalWidth - photo_img_holder.offsetWidth) / 2; | ||||||
|     } |     } | ||||||
|     else |     else | ||||||
|     { |     { | ||||||
|         x = (img.naturalWidth - div.offsetWidth) * (event.offsetX / div.offsetWidth); |         x = (photo_img.naturalWidth - photo_img_holder.offsetWidth) * (mouse_x / photo_img_holder.offsetWidth); | ||||||
|     } |     } | ||||||
|     if (img.naturalHeight < div.offsetHeight) |     if (photo_img.naturalHeight < photo_img_holder.offsetHeight) | ||||||
|     { |     { | ||||||
|         y = (img.naturalHeight - div.offsetHeight) / 2; |         y = (photo_img.naturalHeight - photo_img_holder.offsetHeight) / 2; | ||||||
|     } |     } | ||||||
|     else |     else | ||||||
|     { |     { | ||||||
|         y = (img.naturalHeight - div.offsetHeight) * (event.offsetY / div.offsetHeight); |         y = (photo_img.naturalHeight - photo_img_holder.offsetHeight) * (mouse_y / photo_img_holder.offsetHeight); | ||||||
|     } |     } | ||||||
|     //console.log(x); |     //console.log(x); | ||||||
|     div.style.backgroundPosition=(-x)+"px "+(-y)+"px"; |     photo_img_holder.style.backgroundPosition=(-x)+"px "+(-y)+"px"; | ||||||
| } | } | ||||||
| function receive_callback(response) | function receive_callback(response) | ||||||
| { | { | ||||||
|  | @ -253,3 +265,4 @@ function submit_tag(callback) | ||||||
|     add_tag_box.value = ""; |     add_tag_box.value = ""; | ||||||
| } | } | ||||||
| </script> | </script> | ||||||
|  | </html> | ||||||
|  |  | ||||||
|  | @ -1,5 +1,9 @@ | ||||||
| <!DOCTYPE html5> | <!DOCTYPE html5> | ||||||
| <html> | <html> | ||||||
|  | <head> | ||||||
|  |     <title>Etiquette</title> | ||||||
|  |     <meta charset="UTF-8"> | ||||||
|  |     <link rel="stylesheet" href="/static/common.css"> | ||||||
| 
 | 
 | ||||||
| <style> | <style> | ||||||
| body, a | body, a | ||||||
|  | @ -21,13 +25,9 @@ a:hover | ||||||
|     background-color: #ffffd4; |     background-color: #ffffd4; | ||||||
| } | } | ||||||
| </style> | </style> | ||||||
| 
 |  | ||||||
| <head> |  | ||||||
|     <title>Etiquette</title> |  | ||||||
|     <meta charset="UTF-8"> |  | ||||||
|     <link rel="stylesheet" href="/static/common.css"> |  | ||||||
| </head> | </head> | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| <body> | <body> | ||||||
|     <span>{{motd}}</span> |     <span>{{motd}}</span> | ||||||
|     <a href="/search">Search</a> |     <a href="/search">Search</a> | ||||||
|  | @ -35,10 +35,7 @@ a:hover | ||||||
|     <a href="/albums">Browse albums</a> |     <a href="/albums">Browse albums</a> | ||||||
| </body> | </body> | ||||||
| 
 | 
 | ||||||
| </html> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
| <script type="text/javascript"> | <script type="text/javascript"> | ||||||
| </script> | </script> | ||||||
|  | </html> | ||||||
|  |  | ||||||
|  | @ -7,7 +7,7 @@ | ||||||
|     <meta charset="UTF-8"> |     <meta charset="UTF-8"> | ||||||
|     <link rel="stylesheet" href="/static/common.css"> |     <link rel="stylesheet" href="/static/common.css"> | ||||||
|     <script src="/static/common.js"></script> |     <script src="/static/common.js"></script> | ||||||
| </head> | 
 | ||||||
| <style> | <style> | ||||||
| form | form | ||||||
| { | { | ||||||
|  | @ -114,6 +114,8 @@ form | ||||||
|     <button class="remove_tag_button_perm" onclick="orderby_remove_hook(this);"></button> |     <button class="remove_tag_button_perm" onclick="orderby_remove_hook(this);"></button> | ||||||
| </li> | </li> | ||||||
| {% endmacro %} | {% endmacro %} | ||||||
|  | </head> | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| <body> | <body> | ||||||
|     {{header.make_header()}} |     {{header.make_header()}} | ||||||
|  | @ -244,7 +246,6 @@ form | ||||||
|     </div> |     </div> | ||||||
|     </div> |     </div> | ||||||
| </body> | </body> | ||||||
| </html> |  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| <script type="text/javascript"> | <script type="text/javascript"> | ||||||
|  | @ -526,3 +527,4 @@ input_mays.onkeydown = function(){tag_input_hook(this, inputted_mays, "search_bu | ||||||
| input_forbids.onkeydown = function(){tag_input_hook(this, inputted_forbids, "search_builder_forbids_inputted")}; | input_forbids.onkeydown = function(){tag_input_hook(this, inputted_forbids, "search_builder_forbids_inputted")}; | ||||||
| bind_box_to_button(input_expression, document.getElementById("search_go_button")); | bind_box_to_button(input_expression, document.getElementById("search_go_button")); | ||||||
| </script> | </script> | ||||||
|  | </html> | ||||||
|  | @ -6,7 +6,7 @@ | ||||||
|     <meta charset="UTF-8"> |     <meta charset="UTF-8"> | ||||||
|     <link rel="stylesheet" href="/static/common.css"> |     <link rel="stylesheet" href="/static/common.css"> | ||||||
|     <script src="/static/common.js"></script> |     <script src="/static/common.js"></script> | ||||||
| </head> | 
 | ||||||
| <style> | <style> | ||||||
| body | body | ||||||
| { | { | ||||||
|  | @ -55,6 +55,8 @@ body | ||||||
|     align-items: center; |     align-items: center; | ||||||
| } | } | ||||||
| </style> | </style> | ||||||
|  | </head> | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| <body> | <body> | ||||||
| {{header.make_header()}} | {{header.make_header()}} | ||||||
|  | @ -84,8 +86,6 @@ body | ||||||
| </div> | </div> | ||||||
| </body> | </body> | ||||||
| 
 | 
 | ||||||
| </html> |  | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
| <script type="text/javascript"> | <script type="text/javascript"> | ||||||
| var box = document.getElementById('add_tag_textbox'); | var box = document.getElementById('add_tag_textbox'); | ||||||
|  | @ -143,3 +143,4 @@ function submit_tag(callback) | ||||||
|     box.value = ""; |     box.value = ""; | ||||||
| } | } | ||||||
| </script> | </script> | ||||||
|  | </html> | ||||||
|  |  | ||||||
							
								
								
									
										23
									
								
								etiquette/templates/template.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								etiquette/templates/template.html
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,23 @@ | ||||||
|  | <!DOCTYPE html5> | ||||||
|  | <html> | ||||||
|  | <head> | ||||||
|  |     {% import "header.html" as header %} | ||||||
|  |     <title>Flasksite</title> | ||||||
|  |     <meta charset="UTF-8"> | ||||||
|  |     <link rel="stylesheet" href="/static/common.css"> | ||||||
|  | 
 | ||||||
|  | <style> | ||||||
|  | </style> | ||||||
|  | </head> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | <body> | ||||||
|  | <div id="content_body"> | ||||||
|  |     <p>test</p> | ||||||
|  | </div> | ||||||
|  | </body> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | <script type="text/javascript"> | ||||||
|  | </script> | ||||||
|  | </html> | ||||||
		Loading…
	
		Reference in a new issue