Commit graph

619 commits

Author SHA1 Message Date
0eb8fd3f1b Fix incorrect short-circuit order of add_chidren bail. 2020-09-27 19:49:27 -07:00
06340d03da Dedent these loops via comprehensions of questionable clarity. 2020-09-27 13:50:35 -07:00
fa512eff28 Add argument once_each, set to False if you want every permutation. 2020-09-27 13:28:03 -07:00
97cc023866 Add Groupable methods has_ancestor, _descendant, _parent. 2020-09-27 13:01:19 -07:00
667c14f072 Add search argument within_directory. 2020-09-27 10:48:01 -07:00
da67740689 Move these print statements to log.debug. 2020-09-27 10:47:32 -07:00
51b2642be9 Let data_directory take an existing pathclass instance. 2020-09-27 10:45:58 -07:00
a2fc49b6e7 Let config.log_level None -> setLevel(NOTSET). 2020-09-27 10:45:07 -07:00
343ce508bf Add search UI for yield_albums. 2020-09-24 14:26:51 -07:00
9a85714df7 Use pathclass.Path.makedirs. 2020-09-24 14:18:23 -07:00
28181428be Synchronize Etiquette and YCDL. 2020-09-22 02:54:26 -07:00
18e1849fcf Fix video_thumbnail not checking if probe failed before using it. 2020-09-20 18:31:55 -07:00
2accb5c961 Use pathclass.Path.open. 2020-09-20 18:31:31 -07:00
55e66c8656 Fix NameError during set_override_filename. 2020-09-20 13:43:02 -07:00
f8e03bed21 Replace usage of row[0] with (column,) tuple unpack. 2020-09-20 13:41:22 -07:00
fa57386908 Don't call p.get_tags until needed, and don't sort them. 2020-09-20 13:17:51 -07:00
f56da72881 Return more sets from backend, do sorting on frontend.
It's better semantically for these items coming out of the backend
to be sets. Sorted lists are only relevant to human consumption at the
frontend.
2020-09-20 13:16:52 -07:00
317fa3b51d Call assert_not_deleted before every @transaction. 2020-09-20 12:46:52 -07:00
497abf26cd Move circular dependency to end of file. 2020-09-20 12:46:38 -07:00
5c4c0a3034 Let jsonify.photo expect that tags are sets, not lists. 2020-09-20 12:06:10 -07:00
a8f5f858b7 Add abstractmethod to Groupable methods that write; dunder methods.
The read-only methods like get_* and has_* don't need to be overridden,
but for anything that writes I don't want to forget to override them
with feature decorators etc.
2020-09-20 12:04:49 -07:00
2a89cf33d3 Add has_tags=False suggestion to digest_directory docstring. 2020-09-20 11:43:18 -07:00
512470f73d Add log statement for PDB.digest_directory. 2020-09-20 11:42:44 -07:00
1acd570467 Simplify log statement for Photo.rename_file. 2020-09-20 11:41:33 -07:00
718da6c5c3 Remove leftover attributes group_sql_index, group_getter. 2020-09-20 11:41:15 -07:00
b66464dc46 Add exceptions.DeletedObject and ObjectBase.assert_not_deleted. 2020-09-20 11:31:51 -07:00
85260144ef Add attribute deleted to all objects, for held instances.
If an instance is being held in two places, and then one of them
calls delete(), the other can check deleted before doing anything with
the object.
2020-09-20 11:16:07 -07:00
7412ef5162 Let parse_unit_string try int before float. 2020-09-19 04:01:49 -07:00
865c3011e5 Some linting. 2020-09-19 03:59:37 -07:00
0df556da3f Some more stricter type checks and exceptions. 2020-09-19 03:52:42 -07:00
2db1f12bfb Add constants.USER_ID_CHARACTERS and show that when raising invalid. 2020-09-19 03:51:55 -07:00
b223691107 Add helpers.collapse_whitespace. 2020-09-19 03:50:55 -07:00
1013fb81c1 Call assert_no_such_user before assert_valid_password. 2020-09-19 03:35:26 -07:00
7b7015125e Add period to all exception messages. 2020-09-19 03:32:16 -07:00
06c811d858 Move all get_user_id_or_none calls to "these might raise" portions. 2020-09-19 03:24:02 -07:00
adb1d0ef39 Replace all double blank lines with single, improve hash headers.
There was always some semblance that two blank lines has some kind of
meaning or structure that's different from single blank lines, but
in reality it was mostly arbitrary and I can't stand to look at it
any more.
2020-09-19 03:13:23 -07:00
a7cc6d2383 Rename all caught exception variables to "exc", not "e". 2020-09-19 03:08:45 -07:00
854f210a4f Alphabetize Photo.set_searchhidden. 2020-09-18 13:11:56 -07:00
4b5a52abb4 Take advantage of the tag_exports cache for get_all_tag_names. 2020-09-17 21:22:54 -07:00
4bcfd9958a Split get_user into _by_id, _by_username. 2020-09-17 21:11:42 -07:00
22d16693f3 Remove path parameter from get_album, remove get_album_by_id.
First of all, I realized the return statement was using the
outdated singular name of the method. But anyway, I don't like the
idea that this method would sometimes return a single album by id
or a list of albums by path. If you want to get by path, use
get_albums_by_path explicitly.
2020-09-17 21:09:10 -07:00
838982b6c3 Let login take username.
This cuts back on unnecessary sql selects.
2020-09-17 21:02:55 -07:00
40e458e713 Don't update self.attribute until sql_update goes through. 2020-09-17 20:44:33 -07:00
a093dc273c Update self.real_path after relocating and renaming. 2020-09-17 20:43:17 -07:00
39b7f3cd98 Experiment: Remove character whitelist for tag names.
I have always felt bad about forbidding unicode in tag names,
but I want to make sure I have a grip on sanitization / preventing
abuse before allowing it. I think stripping control characters is
enough and any abuse can be handled manually.
Of course that's all fiction because there are no users except myself.
2020-09-17 18:52:06 -07:00
26b9371f26 When @transaction rolls back, log the name of the called method. 2020-09-17 18:33:56 -07:00
c99f6858df Add Photo.normalize_override_filename. 2020-09-17 17:46:52 -07:00
c91888a738 Some linting. 2020-09-15 19:47:07 -07:00
d093843f28 Use sql_execute instead of sql.execute. 2020-09-15 14:58:05 -07:00
750d93673d Add method purge_deleted_associated_directories. 2020-09-15 14:57:20 -07:00
37bff5c427 Look for renamed files (lost&found) during digest_directory. 2020-09-15 14:57:05 -07:00
9578dc4d67 Add column for photo's st_dev, st_ino to facilitate lost&found. 2020-09-15 14:56:45 -07:00
50ecc4c1c1 Let digest_directory act as a generator, yielding photos & albums. 2020-09-15 13:48:06 -07:00
37c784982a Add PDB.clear_all_caches. 2020-09-15 13:44:49 -07:00
5bc3fdd08e Move purge_empty_albums to PDBAlbumMixin. 2020-09-15 13:44:28 -07:00
5b4cc5bf9c Log the exception before rolling back. 2020-09-14 20:25:24 -07:00
5d40622b76 Add log for Photo.relocate. 2020-09-14 19:38:29 -07:00
be0747fd8c Use path.absolute_path when logging add_associated_directory. 2020-09-14 19:38:13 -07:00
8279a1871b Return set instead of list from get_parents, get_tags. 2020-09-14 18:34:14 -07:00
a32caafb8b Remove leftover print statements. 2020-09-14 16:56:55 -07:00
1f7ffbb283 Fix old reference to incorrect variable name tagname. 2020-09-14 05:50:10 -07:00
f3bceb4688 Remove get_cached_flat_dict, add get_cached_tag_export. 2020-09-14 05:49:24 -07:00
cf64c79809 When grouping tags, update tagged photos to prefer child.
I am also considering applying the opposite effect when ungrouping.
Should a photo with A.B get A when A and B are ungrouped? There are
some cases where the answer is yes, and others no, depending on the
reason you're ungrouping the tags. Whereas this change is non-
controversial and simply enforces the existing standard of adding
more specific tags to a photo.
2020-09-14 05:46:43 -07:00
f1d17350a7 Add Photo.remove_tags. 2020-09-14 05:38:20 -07:00
85f24dd1f5 Let Photo.remove_tag only remove exact tag, not children.
I wrote this because I felt it would be a useful shorthand, as a way
of nuking all tags of a subtree off a photo, but it's too easy
to cause collateral damage when composing remove_tag with other
functions. So, when you remove tags from a photo, you'll have to be
more specific.
2020-09-14 05:37:47 -07:00
54add8ad61 Add search parameter yield_albums.
The exact details of this feature are still experimental, but I think
the concept is sound enough to make it an official parameter.
2020-09-14 05:16:36 -07:00
188095c30b Remove unnecessary intermediate variable syn_lines. 2020-09-12 17:33:45 -07:00
5dcccae646 Fix add_children all(bail) causing short-circuit. 2020-09-12 13:14:40 -07:00
d41bad63e7 Move reset of cached_tag_flat_dict out of GroupableMixin into Tag.
That should not have been there!
Needed to add the BAIL sentinel so that Tag methods would only
reset the cache if the internal method actually did made any changes.
2020-09-12 01:19:03 -07:00
74445d0a1f Add internal _add_child so that plural doesn't call transacted.
add_children was calling add_child in a loop. Since this is a parent
class, that call would actually call the subclasses' add_child method,
which has a transaction decorator, and create unnecessary transactions.
2020-09-12 01:00:39 -07:00
21921dc8fc Rename cached_frozen_children -> cached_tag_flat_dict. 2020-09-12 00:56:32 -07:00
b59c2700db Update _lift_children docstring. 2020-09-12 00:53:12 -07:00
1a53af8821 Replace horrible flat_dict algorithm with actual recursion. 2020-09-12 00:21:37 -07:00
2a9b2cd095 Add methods PDB.get_thing_count for all thing types. 2020-09-11 23:51:57 -07:00
cfb48a8d11 Add disclaimer about yield order to get_things_by_id. 2020-09-11 22:13:30 -07:00
0cdd8c0d71 Add detailed doctstring to digest_directory. 2020-09-11 15:49:02 -07:00
4a3236babe Update digest_directory to handle plural albums at every step. 2020-09-11 15:48:37 -07:00
dea746c45a Alphabetize Album's methods. 2020-09-11 15:21:13 -07:00
1cc70616a5 Replace get_album_by_path with get_albums_by_path generator. 2020-09-11 15:15:12 -07:00
7705848714 Let new_album take multiple associated directories. 2020-09-11 15:02:33 -07:00
519bcf32e6 Add separate plural method Album.add_associated_directories. 2020-09-11 15:02:15 -07:00
8ed5f0be51 Fix tag_expression usage of frozen_children which was tag objects.
At some point, I changed tag_export.flat_dict from using strings as
keys to using actual Tag objects as keys. The tag expression handler
never got updated, so frozen_children[tagname] raised KeyError as
it was looking for a string.
I considered using tag_expression_tree.map to convert all the tree
tokens into tag objects, but when we render the tree back into text
it will say "Tag:name" instead of just "name" throughout the whole
expression, and I don't want to deal with converting those back.
2020-09-09 12:58:57 -07:00
30d7dbdb39 Fix tag_export.flat_dict which was not truthful about synonyms. 2020-09-09 12:53:51 -07:00
a79e14e120 Let search_kwargs[orderby] give back None instead of empty list. 2020-09-09 12:20:49 -07:00
7eb095e17c Experiment: Use width*height instead of area column when searching.
Will see if this has any adverse effects, or if it goes well I can
remove the area and ratio columns.
2020-09-08 21:59:42 -07:00
a8fa621f01 Rewrite helpers.comma_space_split with a simple regex. 2020-09-04 17:00:01 -07:00
e774b5f101 Fix zip_photos attempting to add deleted files. 2020-08-30 18:48:08 -07:00
0b4542089b Accommodate chunk_sequence which now always yields lists. 2020-08-28 17:57:15 -07:00
e40c91a7cf Split reload_metadata into separate functions by mimetype. 2020-08-28 17:51:07 -07:00
45d8809971 Fix crash while trying to get size of deleted file.
Pathclass no longer returns None for missing files, as it did when
this was written.
2020-08-28 17:32:53 -07:00
fa8bbf92f9 Remove call to logging.basicconfig, let the frontend do it. 2020-08-12 12:23:51 -07:00
b15beb73eb Rewrite chunk_sequence to work with generators. 2020-08-12 11:21:48 -07:00
b21e6a1206 Show data directory in DatabaseOutOfDate message, not db file. 2020-07-01 16:19:54 -07:00
363d0bac67 Move THING_CLASSES and thing-related methods to new mixin.
I realized there's no need to have that on the global scope when
it is only used for the thing-methods.
2020-04-15 16:33:16 -07:00
5dffe52830 Start _cached_sql_tables as None, and in the SQL mixin. 2020-04-15 16:31:47 -07:00
35895856e6 Use .clear() instead of reassigning to empty lists.
I cannot remember if there is a reason I chose to use empty lists.
If there is, I'll rediscover it and write a comment. Until then, it
makes sense to use clear as an explicit clearing of the list.
2020-04-15 16:31:09 -07:00
43a665fd91 Replace more %s with fstrings. 2020-04-15 16:29:56 -07:00
930960e22a Move this config prep code into voussoirkit as configlayers. 2020-04-03 17:09:01 -07:00
9c96522cfc Remove thing_map table, just use thing_map class.table. 2020-04-03 15:20:09 -07:00
545ea62818 Add some docstrings and comments near get_cached_instance. 2020-04-03 12:33:19 -07:00
5a16579fe3 Add a 'type' string to all etiquette jsonify outputs. 2020-04-02 22:43:20 -07:00
dd3d40de53 Experimental: Allow search results to include albums.
I've been thinking about this for a while but couldn't think of
the perfect way to implement it. I still haven't, so instead I'm
just starting with something and we'll see how to improve later.
At any rate, I can update the rest of the system to expect Albums
coming out of search so that if I ever have a better algorithm
everything else will already be ready for it.
For this first experiment, just any photos that are part of an album
will send that album out as a result. It doesn't even respect the
limit parameter, it's really just to see how it feels to use.
2020-04-02 22:36:40 -07:00
e94e35c98c Add option to natural_sort filenames before digesting. 2020-04-02 21:57:54 -07:00
374763f990 Reduce log level of savepoints to 5.
So far I am satisfied with how they are working, and they clutter
the output so much I can't read anything else.
For reference, logging.DEBUG is 10.
2020-04-02 21:56:41 -07:00
0fdf08adf5 Fix bug where searching musts=[A, A.B] ignored B.
The problem was that during the expansion of A, B would get added to
the `total` set. And then because B was already in total, it would
bail early instead of expanding, but that meant it got left out of
the final query. But this only happened sometimes since random set
ordering would sometimes expand B before A and everything was ok.
I think the best solution is to do this first pass that eliminates
ancestors. Furthermore, I realized that the entirety of expand_nested
hinged on this flawed logic and was otherwise completely redundant
for a simple list comprehension.
2020-03-19 19:04:09 -07:00
13c3a1c0e9 Update docstrings for walk_children, walk_parents. 2020-03-19 19:03:47 -07:00
0a8a754cbc Replace set([]) with {}. 2020-03-19 17:40:52 -07:00
e35efb5c61 Make this string an r-string so it gets better syntax highlighting. 2020-03-11 18:11:54 -07:00
6529aedde6 Add docstring to PDB.__init__. 2020-03-06 09:43:16 -08:00
3f2cde02e1 Use send2trash to support recycle_instead_of_delete. 2020-02-27 14:18:46 -08:00
961ece0081 digest_directory excludes extend defaults instead of overriding them.
With this change, there is currently no way to specify that I actually
want to include thumbs.db etc, but I think the likelikhood of wanting
to extend the defaults greatly exceeds wanting to overrid them.
2020-02-27 14:17:30 -08:00
9d620b4b97 Remove unused imports & other small things. 2020-02-20 22:44:56 -08:00
854fa4db51 Rename PDB.register_user -> new_user.
I was treating User a little bit special here, but I prefer to
have the more consistent terminology.
2020-02-20 00:18:40 -08:00
1fc2ed09f5 Remove commit argument from ALL methods. @transaction does it. 2020-02-19 23:56:09 -08:00
0a984117c5 Add rollback queue, like commit queue. 2020-02-19 23:46:30 -08:00
8c854f3b6a Improve this comment about Photo rename logic. 2020-02-19 23:22:08 -08:00
f99d3d03d9 Photo.rename new_path.assert_not_exists. 2020-02-19 23:12:29 -08:00
00a443eec3 Always use the commit queue, don't bypass with commit=True. 2020-02-19 23:12:11 -08:00
7f3602d673 Remove @transaction from mixin methods, apply it to object methods. 2020-02-19 23:10:49 -08:00
953a85c998 Delete method Tag.leave_group, leftover from 1-parent days. 2020-02-19 23:05:55 -08:00
8c797024e0 Remove calls to pdb.commit(). Let @transaction do it. 2020-02-19 22:58:21 -08:00
203fb9e00f @transaction intercept commit argument; commit / release here. 2020-02-19 22:36:00 -08:00
04f3f6f297 Remove commit=False from all method calls, it's default now. 2020-02-19 22:20:21 -08:00
3a9d7fc2dc Set default commit=False for ALL methods.
I'm working on tightening up some of the transaction code. In the
past it was default commit=True because I would launch the repl, do
something, and quit, so it was nice to have auto commit. But really
it makes more sense to have it default False and be explicit when
to commit.
2020-02-19 20:08:24 -08:00
108ba8bd95 Add PDB.release_savepoint. 2020-02-19 17:00:08 -08:00
bcd13b9ae4 Make the commit queue task popping a little more clear. 2020-02-19 16:26:23 -08:00
e7c90faf79 PhotoDB.rollback without savepoint should roll all, like real sql.
In sqlite3, rollback without a savepoint undoes the entire pending
transaction stack, whereas I was just popping the last save.
This change makes it match real sqlite. Also the only current call
for rollback is in the @transaction decorator which is already
explicit.
2020-02-19 16:26:02 -08:00
9e0051ca9c Photo.move_file assert new path doesn't exist yet. 2020-02-19 16:23:31 -08:00
1375d9fb26 Fix new_photo, data[extension] to use new pathclass.Extension. 2020-02-19 15:11:52 -08:00
5da8d793d6 Return this None instead of assigning then returning. 2020-02-19 14:06:53 -08:00
31517a41d2 Add missing period on exception message. 2020-02-19 13:11:57 -08:00
92f3569971 Use of extract_table_column_map has moved to sqlhelpers. 2020-02-07 15:15:49 -08:00
b88d577ddd Use voussoirkit.imagetools for fit_into_bounds function. 2020-02-04 19:35:46 -08:00
25ed427272 Wrap DB_INIT in a transaction. 2020-02-04 18:43:30 -08:00
d6d7521bce Assert table exists for any sql op involving argument tables.
At the moment, all of these functions are safe because they're
called with hardcoded tables determined by other code, not user input.
But while I was working in this area I felt it would be good to add
a safety check just in case.
2020-02-04 18:15:14 -08:00
64f9eb5f2b Replace some % formatting with fstrings. 2020-02-04 18:12:41 -08:00
eff0efdf40 Indicate required feature in exception message. 2020-01-29 23:52:25 -08:00
2ffe3940e6 Update OutOfDate message to show actual argument. 2020-01-28 10:52:19 -08:00
93eb693bee Separate version_pragma from other pragmas!
This was a dumb bug. Because the version was included in the pragmas
that get set on every load, the database was receiving the new
user_version simply by setting skip_version_check=False and letting
the regular pragmas load, so all future checks passed without
having to run the db upgrader.
2020-01-27 20:46:32 -08:00
222d63857e Replace which with winwhich. 2020-01-21 23:50:11 -08:00
1b308d7921 Fix seconds_to_hms bug!
Embarrassing. If M was zero then you got HH:SS.
2020-01-06 20:21:41 -08:00
3bd8fe6392 Raise FileNotFound from read_filebytes. 2019-12-10 12:48:28 -08:00
9fa49bbddf Add parameter only_shrink to fit_into_bounds. 2019-08-14 13:48:22 -07:00
947d05a4fa Revert 488d793, reinstate PhotoDB.normalize_tagname.
In that commit, I missed three more calls in objects.py and
now I'm deciding that 5x copy-paste is not worth it.
2019-06-15 16:49:52 -07:00
bdff14ecf2 Identify a logic error without actually fixing it.
😎
2019-04-26 23:14:14 -07:00
cc6e7a8b16 Improve line consistency across the PhotoDB.new_* methods.
By clarifying why some lines are above / below the generate_id
call and putting similar code in similar order to each other.
2019-04-26 23:12:55 -07:00
a9865d8546 Replace PhotoDB.normalize_tagname with real call to Tag.norm_name.
I originally did this because I didn't want to accidentally call
Tag.normalize_name and forget to pass the valid parameters. However,
having this single method be on PhotoDB while the other norms are
part of their proper class has been an eyesore.
So since there are only a few calls to this I'm just inlining them
and trusting to not forget if I add more in the future.
2019-04-26 23:06:41 -07:00
8c74e42a74 Add Album.has_any_associated_directory. 2019-04-26 18:55:03 -07:00
ebde5c7ee8 Give each object class a table and centralize db_row normer. 2019-04-26 18:52:56 -07:00
fa97dd5d3c Remove Tag._cached_synonyms. Not worthwhile. 2019-04-05 23:26:11 -07:00
d24f93809b Add message parameter to commit instead of logging separately.
The upside is that we can get rid of some redundancy and reduce
the friction of adding more commit messages.
The downside of this is that the log statement always reports from
commit, instead of the function calling commit. But with unique
messages this shouldn't be too much trouble and should be worth it.
2019-04-01 23:29:01 -07:00
68a567d266 Perform is None check before detailed type checks. 2019-04-01 23:17:35 -07:00
3aa064cde3 Move log statement to top of method. 2019-04-01 23:17:01 -07:00
2f33023025 Replace singular guard continue with simple if. 2019-04-01 23:16:25 -07:00
ad140e485e Two small docstring improvements. 2019-03-16 13:09:02 -07:00
d66dc53215 Require voussoirkit 0.0.28 for sqlhelpers.listify.
Instead of defining that within etiquette.
2019-01-01 18:08:47 -08:00
5d7bc1ff4b Somewhat improve prettiness of hyphen range parse code. 2018-12-27 15:31:56 -08:00
c6c6158062 Save this assignment until it's needed. 2018-12-21 23:44:50 -08:00
7674610b88 Somewhat simplify a few conditions in photodb init. 2018-11-24 22:25:25 -08:00
1eb5a6f465 Rename DatabaseOutOfDate's parameter 'current' -> 'existing'. 2018-11-24 22:06:16 -08:00
707fdcc637 Add album cards and improve album pages.
- album card has placeholder for future thumbnail.
- replaced nested tree hierarchy lists with separate boxes.
- list/grid view also applies to the root listing.
- added a sticky right panel for all the tools. not pretty yet.
- mechanism for adding sticky panel changed. instead of applying
  it to the #right, you apply it to #content_body so that its
  grid layout can be updated properly.
2018-11-12 22:15:59 -08:00
d0208154e4 Add a function to clarify SQL_COLUMNS creation. 2018-11-11 19:08:31 -08:00
dbdd509cd2 Rearrange imports so voussoirkit is right after lib imports.
Added a styleguide.md file to refer back to.
Since voussoirkit is a library it feels better to have it below
the rest of the library and above the local project imports.
2018-11-04 19:27:20 -08:00
de48105e32 When thumbnailing, don't call relative_to on return.
The path given by make_thumbnail_filepath will already have
it in the right place, so this is probably an accident waiting
to happen.
2018-11-04 13:30:34 -08:00
25a27e6241 Move dict_to_params to flask-specific helpers.py.
The rest of etiquette has nothing to do with URLs so this
doesn't belong in the backend helper file.
2018-11-04 13:30:08 -08:00
20e41ad689 Extremely minor touchups. 2018-09-23 14:57:25 -07:00
95edc4d397 Add method Photo.move_file. 2018-09-23 14:54:56 -07:00
4d1575719b Bump voussoirkit requirement to 0.0.24 for pathclass exceptions. 2018-09-23 14:54:11 -07:00
e9f567ffc9 Don't allow Groupable to add itself as a child.
omg what an oversight
2018-09-22 23:14:41 -07:00
670bc8b375 Allow setting searchhidden during new_photo. 2018-09-21 21:31:57 -07:00
0ccfa74709 Let helpers.generate_*_thumbnail raise FileNotFoundError. 2018-08-17 22:05:47 -07:00
bea9f905bd Support downloading .zip of arbitrary photos, clipboard.
Now that creating zips of any photo set is easier, we can
let the user download whatever is on their clipboard.
2018-08-14 23:02:06 -07:00
bc6a0aa907 Improve & generalize zipfile code.
Moved some heavy lifting out of the flask album.zip endpoint
and into helpers.py.
Renamed some things for clarity.
2018-08-14 22:58:26 -07:00
53c86c30a1 Improve clarity of the recursive_dict_ helper functions & usage. 2018-08-11 18:19:55 -07:00
3b3c690ae3 Remove return value from load_config, so no illusion of purity.
This method already relies on object state anyway and writes back
to self.config, so the return value is unnecessary.
2018-08-11 18:19:10 -07:00
9eb9220ca9 Read and write the config file as UTF-8. 2018-08-11 17:57:19 -07:00
fb052a2d56 Fix Album.add_associated_directory not letting duplicates.
The docstring and the actual code were disagreeing.
2018-07-29 16:30:30 -07:00
30e3aa9c6f Simplify and improve rollback logic. 2018-07-29 16:28:57 -07:00
30d96139c2 Remove commit param from PDB.sql_* methods nobody was using.
And is better left to the caller anyway.
2018-07-29 16:05:49 -07:00
9328600355 Add message parameter to PDB.savepoint for better logging.
Helps to have a visual on which methods are creating the saves.
2018-07-29 16:03:04 -07:00
56e7472c93 Revert f-strings to %s for logging calls.
In my excitement I forgot about that rule.
2018-07-29 16:01:26 -07:00
8447fb3343 Make deleting and unlinking tags require confirmation.
Added text inside the delete buttons and made them confirm.
2018-07-28 20:25:25 -07:00
1b90850818 Oops, add the required_feature decorators to remove_child. 2018-07-22 21:06:16 -07:00
2a45f4e17e Add parameter albums to purge_empty_albums as starting set.
Like purge_deleted_files, you can provide a list of albums to
act as the starting point instead of letting it use the default
of all albums.
2018-07-22 20:21:00 -07:00
8a12a24e8e Add tag_autocomplete.js.
Instead of embedding the entire tag list in the search.html template
every single time, this script loads the tags from the new,
cache-enabled endpoint /all_tags.json. Then we can use html5
datalists to create autocomplete forms on the search and photo pages.
2018-07-22 20:19:05 -07:00
bbf07f4401 Fix image thumbnail wrong variable bug.
How long has that been there?
2018-07-22 20:19:05 -07:00
d740e6d686 Oops, fix read_filebytes not stopping at the range_max properly. 2018-07-22 20:18:58 -07:00
4c65ccaf68 Big! Liberate Groupables from strict heirarchy. Multiple parents.
I found that the strict heirarchy was not satisfying the situation
where one tag is the intersection of two others, but we can only
pick one as the parent

For example, does red_jacket belong under clothes.red_clothes or
clothes.jackets? A search for "red_clothes AND jackets" might
give us someone wearing red pants and a black jacket, so this
definitely needs to be a separate tag, but picking only one
parent for it is not sufficient. Now, a search for red_clothes
and a search for jackets will both find our red_jacket photo.

The change also applies to Albums because why not, and I'm sure
a similar case can be made.

Unfortunately this means tags no longer have one true qualname.
The concept of qualnames has not been completely phased out but
it's in progress.

This commit is very big because I was not sure for a long time
whether to go through with it, and so much stuff had to change
that I don't want to go back and figure out what could be grouped
together.
2018-07-20 13:09:06 -07:00
4987db4bd0 Switch to f-string formatting in many places. 2018-07-18 18:36:36 -07:00
4a39873fed Increase default tag cache to 10,000. 2018-07-18 18:27:18 -07:00
38bac41eb9 Add helpers.split_easybake_string for prelim parsing.
Helps to remove some distractions from the main easybake method.
2018-07-15 14:23:43 -07:00
f06b0915ab Add new_photo_kwargs to the create_or_get call.
Due to the closure, it was already working just fine, but I
want the explicitness of having it there.
2018-07-15 13:52:08 -07:00
57a9e0d4dc Move PDB.close out of the sqlmixin, into main class.
Doesn't really deserve to be with the sql stuff.
2018-07-15 13:27:04 -07:00
c37b54b456 Add dividers and rearrange some of the table column parsing. 2018-07-13 19:22:05 -07:00
0852630cd1 Alphabetize _extract_table_name. 2018-06-30 12:55:30 -07:00
c930228d3f Rearrange order of Album.delete ops to not void FK contraint. 2018-06-30 12:51:09 -07:00
c736c33165 Add caching of tag synonyms. 2018-05-06 21:09:15 -07:00
c6b71f1a0d Revert caching of qualified names. Causing too many problems.
The world is just not ready for it. Was having issues about the
parents being deleted / renamed and needing to propogate those
changes in a not-ugly way.
Will reassess in the future.
2018-05-06 21:09:09 -07:00
0c8a57b6aa Make the assert methods public. 2018-05-06 21:09:09 -07:00
40c255b0d0 Pass object instantiations through a cacher.
I want the system to only have one instance of a particular
object at any time, so that we can effectively cache things
in them.
2018-05-06 21:09:08 -07:00