Commit graph

1479 commits

Author SHA1 Message Date
Damien Elmes
ed9901a71d add average review # to forecast 2011-04-28 09:24:00 +09:00
Damien Elmes
30d62875d0 css, more layout tweaks, add suspended back into display 2011-04-28 09:24:00 +09:00
Damien Elmes
282d0bb9ba add deck creation date 2011-04-28 09:24:00 +09:00
Damien Elmes
a5d751283b add a separate _title() 2011-04-28 09:24:00 +09:00
Damien Elmes
f67c72bec3 move the graph layout around 2011-04-28 09:24:00 +09:00
Damien Elmes
2479913f9b add a pie graph, add average interval to ivls area 2011-04-28 09:24:00 +09:00
Damien Elmes
c64c7a2acb hide the cumulative graph if datapoints < 2 2011-04-28 09:24:00 +09:00
Damien Elmes
74a52694ec for daily graph, use minutes instead of hours 2011-04-28 09:24:00 +09:00
Damien Elmes
e950c8af1c just chop off options/group completely 2011-04-28 09:24:00 +09:00
Damien Elmes
0b92423cf7 settings->options, return bool for syncingEnabled 2011-04-28 09:24:00 +09:00
Damien Elmes
4af961f1d0 put langs in lang 2011-04-28 09:24:00 +09:00
Damien Elmes
11f3de525f groupConf() takes gcid, not gid 2011-04-28 09:23:59 +09:00
Damien Elmes
692fba2ea3 use the deck's groups instead of holding on to a private copy 2011-04-28 09:23:59 +09:00
Damien Elmes
e93ded1e04 update a few group configs 2011-04-28 09:23:59 +09:00
Damien Elmes
4b9c6fc822 track gcid additions too 2011-04-28 09:23:59 +09:00
Damien Elmes
77ee8f1385 ditch useGroups 2011-04-28 09:23:59 +09:00
Damien Elmes
f75e2af195 use a single group setting 2011-04-28 09:23:59 +09:00
Damien Elmes
73625e5751 include the gid in the tree so we can tell which groups are real 2011-04-28 09:23:59 +09:00
Damien Elmes
fc96e12a0a add some randomness to lrn interval 2011-04-28 09:23:59 +09:00
Damien Elmes
495b058618 include total count in with rev+due 2011-04-28 09:23:59 +09:00
Damien Elmes
2a1355eb16 make the group tree part of the scheduler instead 2011-04-28 09:23:59 +09:00
Damien Elmes
728715ff84 counts by group 2011-04-28 09:23:59 +09:00
Damien Elmes
2d00163323 tree grouping; add column to groups so they can remember tags 2011-04-28 09:23:59 +09:00
Damien Elmes
e547b0586a simplify undo
The undo code was using triggers and a temporary table to write out all changed rows before making a change. This made for powerful undo/redo support, but had some problems:
- creating the tables and triggers wasn't cheap, especially on mobile devices
- likewise, every data modification required writing into two separate databases, almost doubling the amount of writes required
- it was possible to leave the DB in an inconsistent state if an undoable operation is followed by a non-undoable operation that references the undoable operation, and the user then rolls back the undoable operation.

To address these issues, we simplify undo by integrating it with the autosave changes:
- .save() can be passed a name to mark a rollback point. If the user undoes the change, any changes since the last save are lost
- autosaves happen every 5 minutes, and are pushed back on a .save(), so the maximum work a user can lose is 5 minutes.
- reviews are handled separately, so we can let the user undo multiple reviews at once
- if necessary, special cases could be added for other operations like marking

This means that if a user does two damaging operations in a row they won't be able to restore the first one, but such an event is both unlikely, and is also covered by the backups made each time a deck is opened.
2011-04-28 09:23:59 +09:00
Damien Elmes
01eb8d98a5 update order consts 2011-04-28 09:23:59 +09:00
Damien Elmes
2d6e9cc186 shorten some queue options 2011-04-28 09:23:59 +09:00
Damien Elmes
5914761ff8 don't die if the reps data is empty 2011-04-28 09:23:59 +09:00
Damien Elmes
b52a2eed6d add descriptions and xaxis relabeling 2011-04-28 09:23:59 +09:00
Damien Elmes
674d2b2b30 add outline to ease bars 2011-04-28 09:23:59 +09:00
Damien Elmes
a3c7ae87e7 tweak layout, add cum% for intervals 2011-04-28 09:23:59 +09:00
Damien Elmes
eba64a0d3d give intervals a type too 2011-04-28 09:23:59 +09:00
Damien Elmes
91903a79be simplify graph calls 2011-04-28 09:23:59 +09:00
Damien Elmes
3c5c21f6a6 remove calcStats() 2011-04-28 09:23:59 +09:00
Damien Elmes
457b0f5c73 don't generate all the graphs at once 2011-04-28 09:23:59 +09:00
Damien Elmes
28191cde45 remove average time graph 2011-04-28 09:23:59 +09:00
Damien Elmes
f03745a1a3 average time graph
probably won't use this, but saving the code
2011-04-28 09:23:58 +09:00
Damien Elmes
63efc4dbaa remove the separate timeGraph() 2011-04-28 09:23:58 +09:00
Damien Elmes
40706f3493 break reps graph into separate graphs; exclude cumulative line from stack 2011-04-28 09:23:58 +09:00
Damien Elmes
b9848c8cd9 display different graphs for different due periods; chunk by week or month 2011-04-28 09:23:58 +09:00
Damien Elmes
e090a64fbb remove separate cumul graph and render over due instead 2011-04-28 09:23:58 +09:00
Damien Elmes
b40dbd6fb8 fix young count 2011-04-28 09:23:58 +09:00
Damien Elmes
43f8623d78 tweak graph layout and separate cumul graph into young/mature 2011-04-28 09:23:58 +09:00
Damien Elmes
72ed9ceb02 but don't mark all ease 1s as learning 2011-04-28 09:23:58 +09:00
Damien Elmes
139f1afc41 try to mark initial / lapsed on upgrade 2011-04-28 09:23:58 +09:00
Damien Elmes
494101212e go back to 0.7 due to linewidth 2011-04-28 09:23:58 +09:00
Damien Elmes
d6f968a47f add extra data to reps/time graphs, simplify graph building 2011-04-28 09:23:58 +09:00
Damien Elmes
c7eb4253bd set a different log type for lapsed learning 2011-04-28 09:23:58 +09:00
Damien Elmes
4867ffe25a revert to flot 0.6 due to redraw bug 2011-04-28 09:23:58 +09:00
Damien Elmes
153c574d64 fix lastInt and nextInt being switched on upgrade 2011-04-28 09:23:58 +09:00
Damien Elmes
9c1e0befc6 bundle js libs; include them in report(); fix some graph ids 2011-04-28 09:23:58 +09:00
Damien Elmes
6ec2500eb8 reps & time graphs 2011-04-28 09:23:58 +09:00
Damien Elmes
60ef1ec49f eases graph 2011-04-28 09:23:58 +09:00
Damien Elmes
f850ce8b06 when upgrading, make sure old reps are marked as reviews 2011-04-28 09:23:58 +09:00
Damien Elmes
7d5d72adf8 add intervals, boxing in weeks for now 2011-04-28 09:23:58 +09:00
Damien Elmes
89fa08c548 due and cumulative due graphs ported 2011-04-28 09:23:58 +09:00
Damien Elmes
2ca9568196 initial graph code reorganization 2011-04-28 09:23:58 +09:00
Damien Elmes
cc9f5b8d86 stripMedia->strip 2011-04-28 09:23:58 +09:00
Damien Elmes
15737959f5 fix upgrading of type answer 2011-04-28 09:23:58 +09:00
Damien Elmes
f26c6f76bc fix other missing properties on upgrade 2011-04-28 09:23:57 +09:00
Damien Elmes
3c40854583 fix collapsing; make sure learning cards are put back on the heap 2011-04-28 09:23:57 +09:00
Damien Elmes
e53ae3f2b0 if the colour is missing, it should be black, not white 2011-04-28 09:23:57 +09:00
Damien Elmes
4ff5b81134 return status of scheduler change 2011-04-28 09:23:57 +09:00
Damien Elmes
843e8f3b33 add routine to grab all css 2011-04-28 09:23:57 +09:00
Damien Elmes
cf43d23edd fix factor 2011-04-28 09:23:57 +09:00
Damien Elmes
6b736f9f54 change deck stats layout 2011-04-28 09:23:57 +09:00
Damien Elmes
942bf43b52 fix stats
they're running now, but need to be sanity checked to make sure they're doing the right thing
2011-04-28 09:23:57 +09:00
Damien Elmes
63d1448d1e only bump lrn count when cramming if card not immediately graduated 2011-04-28 09:23:57 +09:00
Damien Elmes
cfd4198503 add call to determine number of buttons to show; 2.5m -> 2.5mo 2011-04-28 09:23:57 +09:00
Damien Elmes
464eb2b684 make sure cramming works if there are no selected groups 2011-04-28 09:23:57 +09:00
Damien Elmes
31427f0133 fix lapse card scheduling
- make sure we set a timestamp due time, and put the card back in the queue
- add a unit test for it
2011-04-28 09:23:57 +09:00
Damien Elmes
765720b928 make sure due forecast returns 0 for empty days 2011-04-28 09:23:57 +09:00
Damien Elmes
e407697fb9 fix interval calculation for lapsed cards in learning queue 2011-04-28 09:23:57 +09:00
Damien Elmes
4d0e4836fe add the ability to add extra classes to q/a 2011-04-28 09:23:57 +09:00
Damien Elmes
1d91e459ec wrap the q/a in the card template div 2011-04-28 09:23:57 +09:00
Damien Elmes
8170b2a2f5 fix templates not being properly upgraded 2011-04-28 09:23:57 +09:00
Damien Elmes
4477e21369 make sure we load css on model init 2011-04-28 09:23:57 +09:00
Damien Elmes
9d52196949 add a bgclass helper func 2011-04-28 09:23:57 +09:00
Damien Elmes
2c545cfb1d drop data from renderQA 2011-04-28 09:23:57 +09:00
Damien Elmes
45d1b788ea optimize card q/a generation and model fetching 2011-04-28 09:23:57 +09:00
Damien Elmes
c63b4085c6 add queueless counts; fix special field references on upgrade 2011-04-28 09:23:57 +09:00
Damien Elmes
4e989d98a9 add switch to disable groups without forgetting the selection 2011-04-28 09:23:57 +09:00
Damien Elmes
31a548ee42 add a dirty flag
when we make changes that need to be cleaned up on exit, we mark the deck
dirty so that if we exit without saving, we can clean up on next open
2011-04-28 09:23:57 +09:00
Damien Elmes
ed75e4bee2 refactor cloze deletions and text:field, add forecast
Previously cloze deletions were handled by copying the contents of one field
into another and applying transforms to it. This had a number of problems:
- after you add a card, you can't undo the cloze deletion
- if you spot a mistake, you have to edit it twice (or more if you have more
  than one cloze for a sentence)
- making multiple clozes requires copying & pasting the sentence multiple
  times
- this also lead to much bigger decks if the sentences being cloze-deleted are
  large
- related clozes can't be spaced apart as siblings

To address these issues, we introduce the idea of cloze tags in the card
template and fields. If the template has the text:

{{cloze:1:field}}

And a field has the following contents:

{{c1::hello}}

Then the template will automatically replace that part of the text with either
occluded text, or a highlighted answer. All other clozes in the field are
displayed normally.

At the same time, we add support for text: into the template library, instead
of manually creating text: fields in the dict for every field.

Finally, add a forecast routine to get the due counts for the next week, which
is used in the GUI.
2011-04-28 09:23:56 +09:00
Damien Elmes
8705085200 update latex support 2011-04-28 09:23:56 +09:00
Damien Elmes
da0fb0c555 space exiting new cards; fix 1 fact freeze 2011-04-28 09:23:56 +09:00
Damien Elmes
8b2971f91c move time taken maximum into group conf 2011-04-28 09:23:56 +09:00
Damien Elmes
eb18460945 save creation time in deck flush, update cutoff on reset not deck load 2011-04-28 09:23:56 +09:00
Damien Elmes
ccc325f87b remove utcOffset; make it a property of crt instead 2011-04-28 09:23:56 +09:00
Damien Elmes
442bb7a7db htmlQuestion/answer() shouldn't be needed anymore 2011-04-28 09:23:56 +09:00
Damien Elmes
138d9881d3 add the ability to limit a cram to a given period 2011-04-28 09:23:56 +09:00
Damien Elmes
9b70af678c add rescheduling and interval reset to cram; don't include already due cards 2011-04-28 09:23:56 +09:00
Damien Elmes
be045d451c remove the media table
The media table was originally introduced when Anki hashed media filenames,
and needed a way to remember the original filename. It also helped with:
1) getting a quick list of all media used in the deck, or the media added
   since the last sync, for mobile clients
2) merging identical files with different names

But had some drawbacks:
- every operation that modifies templates, models or facts meant generating
  the q/a and checking if any new media had appeared
- each entry is about 70 bytes, and some decks have 100k+ media files

So we remove the media table. We address 1) by being more intelligent about
media downloads on the mobile platform. We ask the user after a full sync if
they want to look for missing media, and they can choose not to if they know
they haven't added any. And on a partial sync, we can scan the contents of the
incoming facts for media references, and download any references we find. This
also avoids all the issues people had with media not downloading because it
was in their media folder but not in the media database.

For 2), when copying media to the media folder, if we have a duplicate
filename, we check if that file has the same md5, and avoid copying if so.
This won't merge identical content that has separate names, but instances
where users need that are rare.
2011-04-28 09:23:56 +09:00
Damien Elmes
bd477de1a9 implement cram
still to do:
- altering intervals at cram exit
- tidying up
2011-04-28 09:23:56 +09:00
Damien Elmes
308846aa93 be consistent in review/rev, etc 2011-04-28 09:23:56 +09:00
Damien Elmes
368bdf8d05 set the new types on upgrade 2011-04-28 09:23:56 +09:00
Damien Elmes
22a72d82c6 give card types a more logical order
they are now 0=new, 1=learning, 2=due, to reflect the natural progression
2011-04-28 09:23:56 +09:00
Damien Elmes
6f5918e8cd move reset etc code into sched 2011-04-28 09:23:56 +09:00
Damien Elmes
be56912caf strip all the old cram code; add way to start cramming from deck 2011-04-28 09:23:56 +09:00
Damien Elmes
17f3cabc25 more unit tests, and unbury on close 2011-04-28 09:23:56 +09:00
Damien Elmes
5e0cc2ff5d next time reports and associated unit tests 2011-04-28 09:23:56 +09:00
Damien Elmes
9e46db5b3e update finished msg 2011-04-28 09:23:56 +09:00
Damien Elmes
0a9d032343 remove review early and learn more 2011-04-28 09:23:56 +09:00
Damien Elmes
a7ec356e0d add tests for leech handling 2011-04-28 09:23:56 +09:00
Damien Elmes
908dccc2c0 implement new review code, add unit tests
Instead of the old approach to sibling spacing, we instead try to pick a due
date that doesn't have any siblings.
2011-04-28 09:23:56 +09:00
Damien Elmes
ca0748b664 limit counts to 1000, at least for now 2011-04-28 09:23:56 +09:00
Damien Elmes
4a6b5c9105 generate the counts separately, so they're not limited by queueLimit
this has a negative performance impact on decks with many new cards or reviews
due, but we can't limit the counts to 200 without annoying people
2011-04-28 09:23:55 +09:00
Damien Elmes
14c49a50cd more learning unit tests 2011-04-28 09:23:55 +09:00
Damien Elmes
96f36e66f7 parse tags when creating fact, add selective study, fix emptyAns default 2011-04-28 09:23:55 +09:00
Damien Elmes
1c1ad88973 fix setting of gid and ordinal on import 2011-04-28 09:23:55 +09:00
Damien Elmes
ba09529e34 speed up the revlog migration, tweak db handling
remove the unnecessary transaction magic; we just needed to make sure to
lock again after undo is initialized
2011-04-28 09:23:55 +09:00
Damien Elmes
e49211c5b6 add edue to cards
The 'entry due' is the due time of a failed card before it enters the learning
queue. When the card graduates or is removed, it has its old due time
restored. We could pull this from the revlog, but it's cheaper to do it this
way.
2011-04-28 09:23:55 +09:00
Damien Elmes
17ee7757de add some group utilities 2011-04-28 09:23:55 +09:00
Damien Elmes
f9c3b27e5d give facts a group, so that cards can have their group reset if necessary 2011-04-28 09:23:55 +09:00
Damien Elmes
a702e03df0 add an option to disable the lock 2011-04-28 09:23:55 +09:00
Damien Elmes
945e5e9da8 fix upgrade code for the lock hack 2011-04-28 09:23:55 +09:00
Damien Elmes
9226922af8 properly lock the DB 2011-04-28 09:23:55 +09:00
Damien Elmes
c17758b01c whoops, they're in miliseconds 2011-04-28 09:23:55 +09:00
Damien Elmes
cddbf02734 make sure we return an integer 2011-04-28 09:23:55 +09:00
Damien Elmes
7acda0f06d remove some unused hooks 2011-04-28 09:23:55 +09:00
Damien Elmes
511d6e89a1 remove progress handling code; we'll do it in the GUI or provide cb 2011-04-28 09:23:55 +09:00
Damien Elmes
201e27dd58 add timeToday() and repsToday() 2011-04-28 09:23:55 +09:00
Damien Elmes
174b13f7df speed up new card fetching, add a text factory arg to the db, fix stopMplayer() 2011-04-28 09:23:55 +09:00
Damien Elmes
64bd1dc06a remove some old references in exporting; no attempt to update it yet 2011-04-28 09:23:55 +09:00
Damien Elmes
b2f74b2591 minor tweaks to doc 2011-04-28 09:23:55 +09:00
Damien Elmes
e728d49232 delete -> del for consistency 2011-04-28 09:23:55 +09:00
Damien Elmes
f74d9b68fe trigger the db progress handler after more operations
We originally were triggering on 100 opcodes, because at the time we were
doing write-heavy alterations to the DB for inactive tags, and a higher level
of opcodes would pause the interface for a long time. The query structure is
different now, so we can afford to save the overhead of more frequent calls.

With the change, a .reset() triggers the handler 3 times; fixIntegrity()
triggers it 30 times over a period of 4.5 seconds.
2011-04-28 09:23:55 +09:00
Damien Elmes
1dc3a0ad4a make sure revlog is removed on immediate delete 2011-04-28 09:23:55 +09:00
Damien Elmes
f96a495b53 fact.model -> fact.model() 2011-04-28 09:23:54 +09:00
Damien Elmes
870c80e076 add genCards(), previewCards(), and more unit tests 2011-04-28 09:23:54 +09:00
Damien Elmes
53215230b4 we do the db integrity check on backup so need to in fixIntegrity() 2011-04-28 09:23:54 +09:00
Damien Elmes
98290c485d fix integrity check, move dynamic indices into scheduler
A lot of the old checks in fixIntegrity() are no longer relevant, and some of
the others may no longer be required. They can be added back in as the need
arises.
2011-04-28 09:23:54 +09:00
Damien Elmes
d5cce19b56 store the ordinals in templates/fields
this makes it more convenient to pass around templates/fields without having
to instrument them with their position in the list
2011-04-28 09:23:54 +09:00
Damien Elmes
e6a8f7f619 move time & count code into scheduler 2011-04-28 09:23:54 +09:00
Damien Elmes
66dcd45599 use nextID() when adding facts/cards
We want to ensure that we never recycle ids from deleted cards. We could do
this with an autoincrement column in sqlite, but it's cheaper for us to handle
the ids ourselves, as the deck object is always in memory.
2011-04-28 09:23:54 +09:00
Damien Elmes
7d52805b41 move changeModel() into models.py. It is not yet ported to the new code 2011-04-28 09:23:54 +09:00
Damien Elmes
0db95ded74 add template deletion & unit test 2011-04-28 09:23:54 +09:00
Damien Elmes
4638d3de46 implement field add/delete/rename/move
- now in model.py instead of deck.py
- added unit tests
2011-04-28 09:23:54 +09:00
Damien Elmes
d95cc6c44b implement sort fields; make sure they're updated on upgrade 2011-04-28 09:23:54 +09:00
Damien Elmes
93dcfceffe convert templates to a json object, and replace tid with ord
it's faster for us to parse another json string than pull a record from a
separate db table, and this makes templates and fields consistent
2011-04-28 09:23:54 +09:00
Damien Elmes
9cec4b2059 ints makes no sense in the context of failed cards; tweak learn code 2011-04-28 09:23:54 +09:00
Damien Elmes
8b46cb4daa log the fact that we're leaving the learning queue in factor 2011-04-28 09:23:54 +09:00
Damien Elmes
e4cc3e3013 revlog work
- remove revlog.py and move code into scheduler
- add a routine to log a learn repetition
- rename flags to type and set type=0 for learn mode
- add to unit test
2011-04-28 09:23:54 +09:00
Damien Elmes
2dadb2c933 drop card modified index
Because the cards table is small now, loading it in and doing a table scan
isn't necessary. The facts table is bigger now, so we still need that index.
2011-04-28 09:23:54 +09:00
Damien Elmes
911069d371 remove ord from cards, give templates an optional gid, change addFact()
When adding facts, you can now pass in a group id which the GUI should support
editing. Templates will have an optional group id which overrides the provided
id, so users can automatically put certain card types in a different group (or
all of them, if desired). Greying out the group box in the GUI in that case
would be a good idea.
2011-04-28 09:23:54 +09:00
Damien Elmes
4f2ecda980 update new card unit test 2011-04-28 09:23:54 +09:00
Damien Elmes
3f92254e1a use the id to sort instead of requiring ordinal
This means that the default learn queue sort order doesn't need another column
in the index, but it also means that generated cards will have a higher id,
and would appear later even if they have a lower ordinal. This is probably an
infrequent issue, and a plugin which rewrites ids would probably be an
adequate solution.
2011-04-28 09:23:54 +09:00
Damien Elmes
ad68500494 updateCache -> renderQA, move some functions around 2011-04-28 09:23:54 +09:00
Damien Elmes
0e084f8e3d refactor font rewriting
Our goal is to allow decks created on one platform to use similar fonts (even
if named differently) when moving to another platform. The old solution wasn't
useful for the web version or mobile versions. Instead, we store a mapping in
the deck, and when generating the CSS, we list all possible fonts. An option
in the interface for the user to add extra fonts might be nice.
2011-04-28 09:23:54 +09:00
Damien Elmes
81a093a8f4 move css generation into model
The model now has a css column, and when it's flushed, it generates the css
for the fields and templates. This means we don't have to generate the CSS on
deck load anymore.

The hex cache has also been removed. Javascript couldn't handle big ints, but
since ints are small numbers now, we no longer need a cache to efficiently
convert an id to hex.
2011-04-28 09:23:54 +09:00
Damien Elmes
f5b326c753 more checksum work
- convert checksums to int
- add bulk update & update on upgrade
- add indices pending performance testing. The fsum table & indices add about
  2MB to a deck with 50k unique fields
2011-04-28 09:23:54 +09:00