Commit graph

2027 commits

Author SHA1 Message Date
Damien Elmes
437b4780c0 add missing cardIvl sort 2011-04-28 09:24:02 +09:00
Damien Elmes
13a484ea36 allow user to abort schema mod 2011-04-28 09:24:02 +09:00
Damien Elmes
e339df5ef8 ensure first field can be sorted, flush config out, and ensure schema mod 2011-04-28 09:24:02 +09:00
Damien Elmes
1b3548f164 fix sorting by ease 2011-04-28 09:24:02 +09:00
Damien Elmes
2a225b1fae use the sort property set in the deck 2011-04-28 09:24:02 +09:00
Damien Elmes
d089deae5a add the ability to reverse sort order 2011-04-28 09:24:02 +09:00
Damien Elmes
6617214708 add recent list; fix groups 2011-04-28 09:24:02 +09:00
Damien Elmes
7ffff24790 fix case where multiple models have the same template 2011-04-28 09:24:02 +09:00
Damien Elmes
d6116a5377 model and group searching 2011-04-28 09:24:02 +09:00
Damien Elmes
aacb57c196 add a countless group tree too 2011-04-28 09:24:02 +09:00
Damien Elmes
9ebbdc2be1 sort by card ordinal after fact sort 2011-04-28 09:24:02 +09:00
Damien Elmes
efe6177c7a refactor ordering 2011-04-28 09:24:02 +09:00
Damien Elmes
291bd399b7 field searching
dropped support for field:foo, as you can type 'foo:' instead to accomplish
the same thing
2011-04-28 09:24:01 +09:00
Damien Elmes
57938927e7 users can pass a number for template ordinal; makes show:one obsolete 2011-04-28 09:24:01 +09:00
Damien Elmes
94d4e319ae fids and template searches 2011-04-28 09:24:01 +09:00
Damien Elmes
a13c18cf4b start refactoring find code 2011-04-28 09:24:01 +09:00
Damien Elmes
2343222245 remove rest of q/a searching 2011-04-28 09:24:01 +09:00
Damien Elmes
69a9d665e3 question/answer searching is obsolete 2011-04-28 09:24:01 +09:00
Damien Elmes
4ffd239ea8 remove obsolete striphtmlalt 2011-04-28 09:24:01 +09:00
Damien Elmes
2dfdfad6f2 update license link 2011-04-28 09:24:01 +09:00
Damien Elmes
8fcc6b3085 gpl3->agpl 2011-04-28 09:24:01 +09:00
Damien Elmes
c5e7756304 ensure model/template gid exists; mark schema modified when group deleted 2011-04-28 09:24:01 +09:00
Damien Elmes
86a7106eab when deleting a group, update cards and facts too 2011-04-28 09:24:01 +09:00
Damien Elmes
673913a2a8 fix group tree when no cards use a group 2011-04-28 09:24:01 +09:00
Damien Elmes
95b3f60353 strip sox munging 2011-04-28 09:24:01 +09:00
Damien Elmes
82d006d145 strip noise profile code 2011-04-28 09:24:01 +09:00
Damien Elmes
c682080890 make it easier to get media dir; remove tidyHTML() 2011-04-28 09:24:01 +09:00
Damien Elmes
6ed48171fc add a default group to model, add groupName() 2011-04-28 09:24:01 +09:00
Damien Elmes
f256d18971 return fields in sorted order 2011-04-28 09:24:01 +09:00
Damien Elmes
ab3a86d44e add noautosub arg to mplayer 2011-04-28 09:24:01 +09:00
Damien Elmes
c799b7c97e include model name in stdmodels; provide ability to get model outside cache 2011-04-28 09:24:01 +09:00
Damien Elmes
de81f0238a template moving 2011-04-28 09:24:01 +09:00
Damien Elmes
c8b16a0e0e accept a reload argument in q() 2011-04-28 09:24:01 +09:00
Damien Elmes
dba04598ae pad ivl graph 2011-04-28 09:24:01 +09:00
Damien Elmes
9705dbdcfe small tweaks 2011-04-28 09:24:01 +09:00
Damien Elmes
fba161d0b1 tablify info 2011-04-28 09:24:01 +09:00
Damien Elmes
5dc418060e fix forecost avg calculation 2011-04-28 09:24:00 +09:00
Damien Elmes
02b1494a10 improve review time data; make sure graph bounds include end points 2011-04-28 09:24:00 +09:00
Damien Elmes
4c8eec5659 duplicate imports 2011-04-28 09:24:00 +09:00
Damien Elmes
84d2f32685 move graph code into stats.py; remove old deck stats 2011-04-28 09:24:00 +09:00
Damien Elmes
4be8b9d38c fix zerodiv and other errors 2011-04-28 09:24:00 +09:00
Damien Elmes
a856665824 give the pie a background again 2011-04-28 09:24:00 +09:00
Damien Elmes
b47275599b fix selective on some graphs; tweak pie layout 2011-04-28 09:24:00 +09:00
Damien Elmes
2d8faa8608 give the forecast a sensible limit 2011-04-28 09:24:00 +09:00
Damien Elmes
b5c8ba7b9f apply selective to card/fact counts 2011-04-28 09:24:00 +09:00
Damien Elmes
525787b33f tweak call args 2011-04-28 09:24:00 +09:00
Damien Elmes
014cc035ee add selective study limits to remaining graphs 2011-04-28 09:24:00 +09:00
Damien Elmes
be7794bb56 include day/week info too 2011-04-28 09:24:00 +09:00
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
Damien Elmes
4becd8399c implement field cache, fix unit tests, remove some importers
the field cache (fsums table) also needs to store the model id to preserve the
old behaviour of limiting duplicate checks to a given model, and to ensure
we're actually comparing against the same fields

removed the dingsbums and wcu importers; will accept them back if the authors
port them to the new codebase.
2011-04-28 09:23:54 +09:00
Damien Elmes
1078285f0f change field storage format, improve upgrade speed
Since Anki first moved to an SQL backend, it has stored fields in a fields
table, with one field per line. This is a natural layout in a relational
database, and it had some nice properties. It meant we could retrieve an
individual field of a fact, which we used for limiting searches to a
particular field, for sorting, and for determining if a field was unique, by
adding an index on the field value.

The index was very expensive, so as part of the early work towards 2.0 I added
a checksum field instead, and added an index to that. This was a lot cheaper
than storing the entire value twice for the purpose of fast searches, but it
only partly solved the problem. We still needed an index on factId so that we
could retrieve a given fact's fields quickly. For simple models this was
fairly cheap, but as the number of fields grows the table grows very big. 25k
facts with 30 fields each and the fields table has grown to 750k entries. This
makes the factId index and checksum index really expensive - with the q/a
cache removed, about 30% of the deck in such a situation.

Equally problematic was sorting on those fields. Short of adding another
expensive index, a sort involves a table scan of the entire table.

We solve these problems by moving all fields into the facts table. For this to
work, we need to address some issues:

Sorting: we'll add an option to the model to specify the sort field. When
facts are modified, that field is written to a separate sort column. It can be
HTML stripped, and possibly truncated to a maximum number of letters. This
means that switching sort to a different field involves an expensive rewrite
of the sort column, but people tend to leave their sort field set to the same
value, and we don't need to clear the field if the user switches temporarily
to a non-field sort like due order. And it has the nice properties of allowing
different models to be sorted on different columns at the same time, and
makes it impossible for models to be hidden because the user has sorted on a
field which doesn't appear in some models.

Searching for words with embedded HTML: 1.2 introduced a HTML-stripped cache
of the fields content, which both sped up searches (since we didn't have to
search the possibly large fields table), and meant we could find "bob" in
"b<b>ob</b>" quickly. The ability to quickly search for words peppered with
HTML was nice, but it meant doubling the cost of storing text in many cases,
and meant after any edit more data has to be written to the DB. Instead, we'll
do it on the fly. On this i7 computer, stripping HTML from all fields takes
1-2.6 seconds on 25-50k decks. We could possibly skip the stripping for people
who don't require it - the number of people who bold parts of words is
actually pretty small.

Duplicate detection: one option would be to fetch all fields when the add
cards dialog or editor are opened. But this will be expensive on mobile
devices. Instead, we'll create a separate table of (fid, csum), with an index
on both columns. When we edit a fact, we delete all the existing checksums for
that fact, and add checksums for any fields that must be checked as unique. We
could optionally skip the index on csum - some benchmarking is required.

As for the new table layout, creating separate columns for each field won't
scale. Instead, we store the fields in a single column, separated by an ascii
record separator. We split on that character when extracting from
the database, and join on it when writing to the DB.

Searching on a particular field in the browser will be accomplished by finding
all facts that match, and then unpacking to see if the relevant field matched.

Tags have been moved back to a separate column. Now that fields are on the
facts table, there is no need to pack them in as a field simply to avoid
another table hit.
2011-04-28 09:23:53 +09:00
Damien Elmes
59754eacb2 improve id upgrade speed by a factor of 5 2011-04-28 09:23:53 +09:00
Damien Elmes
9c247f45bd remove q/a cache, tags in fields, rewrite remaining ids, more
Anki used random 64bit IDs for cards, facts and fields. This had some nice
properties:
- merging data in syncs and imports was simply a matter of copying each way,
  as conflicts were astronomically unlikely
- it made it easy to identify identical cards and prevent them from being
  reimported
But there were some negatives too:
- they're more expensive to store
- javascript can't handle numbers > 2**53, which means AnkiMobile, iAnki and
  so on have to treat the ids as strings, which is slow
- simply copying data in a sync or import can lead to corruption, as while a
  duplicate id indicates the data was originally the same, it may have
  diverged. A more intelligent approach is necessary.
- sqlite was sorting the fields table based on the id, which meant the fields
  were spread across the table, and costly to fetch

So instead, we'll move to incremental ids. In the case of model changes we'll
declare that a schema change and force a full sync to avoid having to deal
with conflicts, and in the case of cards and facts, we'll need to update the
ids on one end to merge. Identical cards can be detected by checking to see if
their id is the same and their creation time is the same.

Creation time has been added back to cards and facts because it's necessary
for sync conflict merging. That means facts.pos is not required.

The graves table has been removed. It's not necessary for schema related
changes, and dead cards/facts can be represented as a card with queue=-4 and
created=0. Because we will record schema modification time and can ensure a
full sync propagates to all endpoints, it means we can remove the dead
cards/facts on schema change.

Tags have been removed from the facts table and are represented as a field
with ord=-1 and fmid=0. Combined with the locality improvement for fields, it
means that fetching fields is not much more expensive than using the q/a
cache.

Because of the above, removing the q/a cache is a possibility now. The q and a
columns on cards has been dropped. It will still be necessary to render the
q/a on fact add/edit, since we need to record media references. It would be
nice to avoid this in the future. Perhaps one way would be the ability to
assign a type to fields, like "image", "audio", or "latex". LaTeX needs
special consider anyway, as it was being rendered into the q/a cache.
2011-04-28 09:23:53 +09:00
Damien Elmes
c24bb95b31 move models, templates and fields to incremental ids
any change to them is marked as a schema change anyway, and smaller ids mean
more compact css and a smaller fdata table
2011-04-28 09:23:53 +09:00
Damien Elmes
3cb4ade4a1 simplify bold/italic/underline tags from qt in upgrade 2011-04-28 09:23:53 +09:00
Damien Elmes
e21c944aeb fix a few upgrade/cache issues
- make sure we're actually stripping text in the field cache
- make sure a default group is added on upgrade
- make sure old style field references are upgrade
2011-04-28 09:23:53 +09:00
Damien Elmes
88469a4876 fix upgrade. GUI code should take care of progress handler now 2011-04-28 09:23:53 +09:00
Damien Elmes
2f27133705 drop sqlalchemy; massive refactor
SQLAlchemy is a great tool, but it wasn't a great fit for Anki:
- We often had to drop down to raw SQL for performance reasons.
- The DB cursors and results were wrapped, which incurred a
  sizable performance hit due to introspection. Operations like fetching 50k
  records from a hot cache were taking more than twice as long to complete.
- We take advantage of sqlite-specific features, so SQL language abstraction
  is useless to us.
- The anki schema is quite small, so manually saving and loading objects is
  not a big burden.

In the process of porting to DBAPI, I've refactored the database schema:
- App configuration data that we don't need in joins or bulk updates has been
  moved into JSON objects. This simplifies serializing, and means we won't
  need DB schema changes to store extra options in the future. This change
  obsoletes the deckVars table.
- Renamed tables:
-- fieldModels -> fields
-- cardModels -> templates
-- fields -> fdata
- a number of attribute names have been shortened

Classes like Card, Fact & Model remain. They maintain a reference to the deck.
To write their state to the DB, call .flush().

Objects no longer have their modification time manually updated. Instead, the
modification time is updated when they are flushed. This also applies to the
deck.

Decks will now save on close, because various operations that were done at
deck load will be moved into deck close instead. Operations like undoing
buried card are cheap on a hot cache, but expensive on startup.
Programmatically you can call .close(save=False) to avoid a save and a
modification bump. This will be useful for generating due counts.

Because of the new saving behaviour, the save and save as options will be
removed from the GUI in the future.

The q/a cache and field cache generating has been centralized. Facts will
automatically rebuild the cache on flush; models can do so with
model.updateCache().

Media handling has also been reworked. It has moved into a MediaRegistry
object, which the deck holds. Refcounting has been dropped - it meant we had
to compare old and new value every time facts or models were changed, and
existed for the sole purpose of not showing errors on a missing media
download. Instead we just media.registerText(q+a) when it's updated. The
download function will be expanded to ask the user if they want to continue
after a certain number of files have failed to download, which should be an
adequate alternative. And we now add the file into the media DB when it's
copied to th emedia directory, not when the card is commited. This fixes
duplicates a user would get if they added the same media to a card twice
without adding the card.

The old DeckStorage object had its upgrade code split in a previous commit;
the opening and upgrading code has been merged back together, and put in a
separate storage.py file. The correct way to open a deck now is import anki; d
= anki.Deck(path).

deck.getCard() -> deck.sched.getCard()
same with answerCard
deck.getCard(id) returns a Card object now.

And the DB wrapper has had a few changes:
- sql statements are a more standard DBAPI:
 - statement() -> execute()
 - statements() -> executemany()
- called like execute(sql, 1, 2, 3) or execute(sql, a=1, b=2, c=3)
- column0 -> list
2011-04-28 09:23:53 +09:00
Damien Elmes
8e40fdcb18 set the initial factor when card graduates, not when it's created 2011-04-28 09:23:29 +09:00
Damien Elmes
1d6dbf9900 rework tag handling and remove cardTags
The tags tables were initially added to speed up the loading of the browser by
speeding up two operations: gathering a list of all tags to show in the
dropdown box, and finding cards with a given tag. The former functionality is
provided by the tags table, and the latter functionality by the cardTags
table.

Selective study is handled by groups now, which perform better since they
don't require a join or subselect, and can be embedded in the index. So the
only remaining benefit of cardTags is for the browser.

Performance testing indicates that cardTags is not saving us a large amount.
It only takes us 30ms to search a 50k card table for matches with a hot cache.
On a cold cache it means the facts table has to be loaded into memory, which
roughly doubles the load time with the default settings (we need to load the
cards table too, as we're sorting the cards), but that startup time was
necessary with certain settings in the past too (sorting by fact created for
example). With groups implemented, the cost of maintaining a cache just for
initial browser load time is hard to justify.

Other changes:

- the tags table has any missing tags added to it when facts are added/edited.
  This means old tags will stick around even when no cards reference them, but
  is much cheaper than reference counting or a separate table, and simplifies
  updates and syncing.
- the tags table has a modified field now so we can can sync it instead of
  having to scan all facts coming across in a sync
- priority field removed
- we no longer put model names or card templates into the tags table. There
  were two reasons we did this in the past: so we could cram/selective study
  them, and for plugins. Selective study uses groups now, and plugins can
  check the model's name instead (and most already do). This also does away
  with the somewhat confusing behaviour of names also being tags.
- facts have their tags as _tags now. You can get a list with tags(), but
  editing operations should use add/deleteTags() instead of manually editing
  the string.
2011-04-28 09:23:29 +09:00
Damien Elmes
7c76058f4b add find+search code from ankiqt 2011-04-28 09:23:29 +09:00
Damien Elmes
a902ad0b5f move finding code into separate file 2011-04-28 09:23:28 +09:00
Damien Elmes
55f4b9b7d0 favour integers, change due representation, fact&card ordering, more
- removed 'created' column from various tables. We don't care when things like
  models are created, and card creation time didn't reflect the actual time a
  card was created
- facts were previously ordered by their creation date. The code would
  manually set the creation time for subsequent facts on import by 0.0001
  seconds, and then card due times were set by adding the fact time to the
  ordinal number*0.000001. This was prone to error, and the number of zeros used
  was actually different in different parts of the code. Instead of this, we
  replace it with a 'pos' column on facts, which increments for each new fact.
- importing should add new facts with a higher pos, but concurrent updates in
  a synced deck can have multiple facts with the same pos

- due times are completely different now, and depend on the card type
- new cards have due=fact.pos or random(0, 10000)
- reviews have due set to an integer representing days since deck
  creation/download
- cards in the learn queue use an integer timestamp in seconds

- many columns like modified, lastSync, factor, interval, etc have been converted to
  integer columns. They are cheaper to store (large decks can save 10s of
  megabytes) and faster to search for.

- cards have their group assigned on fact creation. In the future we'll add a
  per-template option for a default group.

- switch to due/random order for the review queue on upgrade. Users can still
  switch to the old behaviour if they want, but many people don't care what
  it's set to, and due is considerably faster, which may result in a better
  user experience
2011-04-28 09:23:28 +09:00
Damien Elmes
11a035e2f8 change the default rev sort order to daily random; add randomize 2011-04-28 09:23:28 +09:00
Damien Elmes
7694ff81c5 replace old selective study with new lists; fix upgrade
- instead of the old 4 settings, we move to just two, as there's no point
  having separate include and exclude options for a non-overlapping set of
  cards
- revGroups and newGroups are a list of groupIds to include in the queue. If
  all groups are enabled, the UI should set it to an empty list rather than a
  list of every available group, and groupLimit() will leave off the
  constraint completely
2011-04-28 09:23:28 +09:00
Damien Elmes
4c931e0ff4 move other queue variables into qconf; discard old selective study 2011-04-28 09:23:28 +09:00
Damien Elmes
b3ee91a9d5 add index for groupId, improve startup speed
- skip updating buried cards on startup; it's expensive and we'll do that on
  deck close in the future
- add an index for groupId. Initial profiling indicates that groupId-based
  selective study is considerably faster in certain scenarios

The 50k element deck I'm testing with now opens and builds the queue in 40ms
on a cold cache, of which 34ms is the initial deck startup and 6ms the queue
build. Adding back the undo log and backups will of course increase this, but
this is a big improvement for checking due times in the deck browser.
2011-04-28 09:23:28 +09:00
Damien Elmes
bb79b0e17c add new 'groups' concept, refactor deletions
Users who want to study small subsections at one time (eg, "lesson 14") are
currently best served by creating lots of little decks. This is because:
- selective study is a bit cumbersome to switch between
- the graphs and statitics are for the entire deck
- selective study can be slow on mobile devices - when the list of cards to
  hide/show is big, or when there are many due cards, performance can suffer
- scheduling can only be configured per deck

Groups are intended to address the above problems. All cards start off in the
same group, but they can have their group changed. Unlike tags, cards can only
be a member of a single group at once time. This allows us to divide the deck
up into a non-overlapping set of cards, which will make things like showing
due counts for a single category considerably cheaper. The user interface
might want to show something like a deck browser for decks that have more than
one group, showing due counts and allowing people to study each group
individually, or to study all at once.

Instead of storing the scheduling config in the deck or the model, we move the
scheduling into a separate config table, and link that to the groups table.
That way a user can have multiple groups that all share the same scheduling
information if they want.

And deletion tracking is now in a single table.
2011-04-28 09:23:28 +09:00
Damien Elmes
abd665e48f remove queue resetting from startup; we'll do it in deck close instead 2011-04-28 09:23:28 +09:00
Damien Elmes
2613143fe9 improve dynamic indices, implement new queue 2011-04-28 09:23:28 +09:00
Damien Elmes
d34a76d5a0 move deck config into json ala models
- limits are stored separately so we can access them quickly when checking
  deck counts
- data is used to store cssCache and hexCache; these may be refactored or go
  away in the future
2011-04-28 09:23:28 +09:00
Damien Elmes
b0b4074cbd start work on learn mode, change models, more
- model config is now stored as a json-serialized dict, which allows us to
  quickly gather the info and allows for adding extra options more easily in
  the future
- denormalize modelId into the cards table, so we can get the model scheduling
  information without having to hit the facts table
- remove position - since we will handle spacing differently we don't need a
  separate variable to due to define sort order
- remove lastInterval from cards; the new cram mode and review early shouldn't
  need it
- successive->streak
- add new columns for learn mode
- move cram mode into new file; learn more and review early need more thought
- initial work on learn mode
- initial unit tests
2011-04-28 09:23:28 +09:00
Damien Elmes
4e7e8b03bc moving scheduling code into separate file, some preliminary refactoring 2011-04-28 09:23:28 +09:00
Damien Elmes
8cbd3c9f3b change deck loading call 2011-04-28 09:23:28 +09:00
Damien Elmes
8a60ee0794 initial changes to models, deck, etc
- move most scheduling parameters from deck to models
- remove obsolete fields in deck and models
- decks->deck
- remove deck id reference in models
- move some deckVars into the deck table
- simplify deckstorage
- lock sessionhelper by default
- add models/currentModel as properties instead of ORM mappings
- remove models.tags
- remove remaining support for memory-backed databases
- use a blank string for syncName instead of null
- remove backup code; will handle in gui
- bump version to 100
- update unit tests
2011-04-28 09:23:28 +09:00
Damien Elmes
2d1d946504 refactor media
- created->modified
- size->refcnt
- originalPath->chksum
- remove description
2011-04-28 09:23:28 +09:00
Damien Elmes
edd8f79ab9 refactor facts table
- spaceUntil->cache
- remove obsolete lastCardId
2011-04-28 09:23:28 +09:00
Damien Elmes
d9c0fba171 refactor tags
- tags.tag -> tags.name
- priority reset to 0 for now; will be used differently in the future
- cardTags.id removed; (tagId, cardId) is the primary key now
- cardTags.src -> cardTags.type
2011-04-28 09:23:28 +09:00
Damien Elmes
80153c63cb forget old gravestones on schema change 2011-04-28 09:23:28 +09:00
Damien Elmes
467eb87a48 use dueCutoff, not current time for delay calculation 2011-04-28 09:23:28 +09:00
Damien Elmes
7547b395ea store revlog time in integer MS
using floats for the primary key causes sqlite to generate an extra index,
which is expensive for large histories
2011-04-28 09:23:28 +09:00
Damien Elmes
9aa2f8dc40 refactor cards
Cards had developed quite a lot of cruft from incremental changes, and a
number of important attributes were stored in names that had no bearing to
their actual use.

Added:

- position, which new cards will be sorted on in the future
- flags, which is reserved for future use

Renamed:

- type to queue
- relativeDelay to type
- noCount to lapses

Removed:

- all new/young/matureEase counts; the information is in the revlog
- firstAnswered, lastDue, lastFactor, averageTime and totalTime for the same
  reason
- isDue, spaceUntil and combinedDue, because they are no longer used. Spaced
  cards will be implemented differently in a coming commit.
- priority
- yesCount, because it can be inferred from reps & lapses
- tags; they've been stored in facts for a long time now

Also compatibility with deck versions less than 65 has been dropped, so decks
will need to be upgraded to 1.2 before they can be upgraded by the dev code.
All shared decks are on 1.2, so this should hopefully not be a problem.
2011-04-28 09:23:27 +09:00
Damien Elmes
f828393de3 rename deck.s to a more understable deck.db; keep s for compat 2011-04-28 09:21:07 +09:00
Damien Elmes
b9cf5ad85d fix timeForNewCard(), revlog sncing, priority index del 2011-04-28 09:21:07 +09:00
Damien Elmes
b6bb03025f new history table
- rename to revlog
- change the pk to time, as we want an index on time, and the old multi-column
  index was expensive and not useful
- remove yes/no count; they can be inferred from the ease
- remove lastFactor, as it's in the previous entry
- remove delay, it can be inferred from last entry
- remove 'next' from nextInterval and nextFactor
- rename 'thinkingTime' to 'userTime'
- rename reps to rep
- migrate old data to new table, and fix some problems in the process: ease0
  -> ease1, and limit thinking time to 60 seconds as it should have been
  previously
2011-04-28 09:21:07 +09:00
Damien Elmes
855de47ffe remove the stats table
The stats table was how the early non-SQL versions of Anki kept track of
statistics, before there was a revision log. It is being removed because:

- it's not possible to show the statistics for a subset of the deck
- it can't meaningfully be copied on import/export
- it makes it harder to implement sync merging

Implications:

- graphs and deck stats roughly 1.5-3x longer than before, but we'll have the
  ability to generate stats for subsections of the deck, and it's not time
  critical code
- people who've been using anki since the very early days may notice a drop in
  statistics, as early repetitions were recorded in the stats table but the
  revlog didn't exist at that point.
- due bugs in old syncs and imports/exports, the stats and revlog may not
  match numbers exactly

To remove it, the following changes have been made:

- the graphs and deck stats now generate their data entirely from the revlog
- there are no stats to keep track of how many cards we've answered, so we
  pull that information from the revlog in reset()
- we remove _globalStats and _dailyStats from the deck
- we check if a day rollover has occurred using failedCutoff instead
- we remove the getStats() routine
- the ETA code is currently disabled
- timeboxing routines use repsToday instead of stats
- remove stats delete from export
- remove stats table and index in upgrade
- remove stats syncing and globalStats refresh pre-sync
- remove stats count check in fullSync check, which was redundant anyway
- update unit tests

Also:

- newCountToday -> newCount, to bring it in line with revCount&failedCount
  which also reflect the currently due count
- newCount -> newAvail
- timeboxing routines renamed since the old names were confusingly similar to
  refreshSession() which does something different

Todo:

- update newSeenToday & repsToday when answering a card
- reimplement eta
2011-04-28 09:21:07 +09:00
Damien Elmes
9ce60d5e3a remove stats from graphs; use revlog 2011-04-28 09:21:07 +09:00
Damien Elmes
b837b92ef2 calculate correct counts via revlog 2011-04-28 09:21:07 +09:00
Damien Elmes
77029c4ee6 calculate # days studied using rev log instead 2011-04-28 09:21:07 +09:00
Damien Elmes
9421a037f6 remove self explanatory module docstrings; strip trailing whitespace 2011-04-28 09:21:07 +09:00
Damien Elmes
9f55c831c0 don't bother checking if temp suspended cards are modified or not 2011-04-28 09:21:07 +09:00
Damien Elmes
218f823037 default to dev server 2011-04-28 09:21:07 +09:00
Damien Elmes
1a09aa9f77 remove minimum average support
Calculating the average on startup is expensive on mobile devices. It might be
nice to provide it as a deck option or per-model setting in the future so that
people can specify how hard their material is and have it treated accordingly.
2011-04-28 09:21:06 +09:00
Damien Elmes
72a1cd73a9 move upgrade code into separate file 2011-04-28 09:21:06 +09:00
Damien Elmes
4302306fe9 use a checksum for field values; fixed import->update number
Previously we had an index on the value field, which was very expensive for
long fields. Instead we use a separate column and take the first 8 characters
of the field value's md5sum, and index that. In decks with lots of text in
fields, it can cut the deck size by 30% or more, and many decks improve by
10-20%. Decks with only a few characters in fields may increase in size
slightly, but this is offset by the fact that we only generate a checksum for
fields that have uniqueness checking on.

Also, fixed import->update reporting the total # of available facts instead of
the number of facts that were imported.
2011-04-28 09:21:06 +09:00
Damien Elmes
da48eb1e55 remove old relativeDelay compat fix in sync 2011-04-28 09:21:06 +09:00
Damien Elmes
feadce76f3 delete tombstones in integrity check as we can guarantee a full sync; optimize 2011-04-28 09:21:06 +09:00
Damien Elmes
1ddf1be747 abort the summary early if we're over the full sync threshold 2011-04-28 09:21:06 +09:00
Damien Elmes
d23a2bbe59 remove old alter table statements from long ago 2011-04-28 09:21:06 +09:00
Damien Elmes
a45dac36c4 remove some duplicate code in the upgrades 2011-04-28 09:21:06 +09:00
Damien Elmes
1a3c8c0c1e remove views and pre 0.9.9.8.6 upgrade code; upgrade test decks to 0.9.9.8.6 2011-04-28 09:21:06 +09:00
Damien Elmes
28604b9d29 remove priorities 2011-04-28 09:21:06 +09:00
Damien Elmes
73d83bc640 fixIntegrity() tweaks
- fix card ordinals too
- don't change modification time on cards, facts or models
- mark schema modified to force full sync
2011-04-28 09:21:06 +09:00
Damien Elmes
1b7ac91a2a force a full sync if there have been schema changes on either side 2011-04-28 09:21:06 +09:00
Damien Elmes
7c2b202163 timestamp schema changes 2011-04-28 09:21:06 +09:00
Damien Elmes
4bf334c6b3 strip some old code 2011-04-28 09:21:06 +09:00
Damien Elmes
1aafbd02f3 use env vars for host/port 2011-04-28 09:19:57 +09:00
Damien Elmes
f78abf2c34 bump version 2011-03-28 16:38:42 +09:00
Damien Elmes
c4e045463b set rd=2 in subscriptions 2011-03-04 14:32:17 +09:00
Damien Elmes
19a293cf74 don't return a negative delay for failed cards 2011-02-24 13:20:19 +09:00
Damien Elmes
5e23e168c0 bump version 2011-02-20 14:08:35 +09:00
Damien Elmes
0b82e1ab3a Merge branch 'master' of ../stable/lib 2011-02-20 13:47:56 +09:00
Damien Elmes
008c5904ca when calculating delay, compare against cutoff, not current time 2011-02-20 13:45:45 +09:00
Damien Elmes
c79db601c6 typo 2011-02-14 03:22:08 +09:00
Damien Elmes
e9ec7f3649 don't escape remote image links
thanks to mark (mhl) for the report
2011-02-14 03:13:16 +09:00
Damien Elmes
f156f81a84 don't add a mature bonus when cramming 2011-02-09 00:36:16 +09:00
Damien Elmes
8828027729 when calculating next interval ensure we don't have a negative delay 2011-02-09 00:23:45 +09:00
Damien Elmes
8a1df1728f rebuildTypes()
- ensure we're fixing relativeDelay for suspended cards
- remove priority compat code
2011-02-08 02:46:07 +09:00
Damien Elmes
07db17be88 off by one in relativeDelay sync code 2011-02-07 00:04:39 +09:00
Damien Elmes
ff38dad5b2 remove redundant code 2011-02-04 20:33:13 +09:00
Damien Elmes
1b027af439 bump version 2011-02-03 00:22:03 +09:00
Damien Elmes
340b5864c8 when deck is finished stop timeboxing timer 2011-02-03 00:18:42 +09:00
Damien Elmes
f3a336a4e4 when exporting a standard anki deck, don't put media in dropbox 2011-02-03 00:14:36 +09:00
Damien Elmes
b8e19d5506 don't copy media on export if disabled 2011-02-03 00:10:40 +09:00
Damien Elmes
1464394d58 when the day rolls over, update due cutoffs too, and rebuild queue 2011-02-02 23:52:34 +09:00
Damien Elmes
e49a9bb5ac relative sibling spacing for reviews
Anki 1.0 had a similar feature but we do things a bit differently now. The
relative spacing applies only to reviews, and spaces cards according to their
interval, instead of spacing all cards the same. Any delay < 1 full day is
treated as no delay, so with the default 10% setting, reviews with an interval
< 10 days are not spaced at all. This should hopefully cut down on support
queries for people wondering why many of their cards were delayed, allows the
two settings to be documented separately, and does away with the somewhat
confusing usage of non-integer new sibling values to disable review spacing.
2011-02-02 23:47:58 +09:00
Damien Elmes
66e44f494b don't update factor in cram, learn more, etc 2011-02-02 22:12:06 +09:00
Damien Elmes
338838583e more last interval preservation into cram scheduler code 2011-02-02 22:10:44 +09:00
Damien Elmes
09e6e1bd65 fix media db check freezing interface if no media folder 2011-02-02 22:04:12 +09:00
Damien Elmes
9bf850c701 don't allow & in filenames as qt tries to escape them in a string 2011-02-02 18:44:49 +09:00
Damien Elmes
80bb59024c utility for percent-escaping images 2011-02-02 18:36:58 +09:00
Damien Elmes
b426ad4271 fix html comments in translator's patch 2011-02-01 18:57:44 +09:00
Damien Elmes
04babfb102 if latex didn't run, prompt user to install 2011-01-31 13:00:11 +09:00
Damien Elmes
e0d5b9d69e never set lastSync=0 when toggling syncing
we should rely on needFullSync() to determine whether a full sync is actually
necessary.
2011-01-30 15:31:29 +09:00
Damien Elmes
d362decca2 Merge https://github.com/ymasory/libanki 2011-01-30 12:46:13 +09:00
Yuvi Masory
b0b9cd2ce3 suppress indentation 2011-01-29 22:40:29 -05:00
Damien Elmes
ab9451253c now all clients are updated, set delay1 = 0 if 600 2011-01-29 11:01:43 +09:00
Damien Elmes
eb0bb89f44 bump version 2011-01-27 08:13:10 +09:00
Damien Elmes
523adc468e allow user to disable review spacing 2011-01-27 07:45:45 +09:00
Damien Elmes
be8eec52bc make sure latex.py works indepent of gui 2011-01-26 15:06:51 +09:00
Damien Elmes
942307190e catch duplicate tags in upgrade 2011-01-26 15:04:32 +09:00
Damien Elmes
ed5a8b0e3e make sure created is reset 2011-01-26 14:36:45 +09:00
Damien Elmes
be3f32755e new option for tz reset without unpack 2011-01-26 14:32:53 +09:00
Damien Elmes
744cf3b16c don't create empty media folder in upgrade 2011-01-26 13:59:54 +09:00
Damien Elmes
6071f8e209 include latex in alt tags of generated image 2011-01-26 13:01:12 +09:00
Damien Elmes
b533c99375 typo in upgrade code 2011-01-24 09:07:47 +09:00
Damien Elmes
7a56e26be6 bump version 2011-01-22 07:36:10 +09:00
Damien Elmes
e042ef5e62 make the format upgrading smarter 2011-01-22 07:36:05 +09:00
Damien Elmes
c1d15b8a9e clearer message when facts missing after sync 2011-01-21 11:02:07 +09:00
Damien Elmes
6860bba0de ensure failed mature come at the start of the future day
- this fixes a state where cards failed on that future day could end up
  with an earlier due date that the rest of the failed mature cards, leading
  to the newly failed cards being repeated prematurely
- this leads to non-deterministic scheduling of the mature bonus fails, so
  they are effectively randomized which is probably what most users want
2011-01-21 09:36:04 +09:00
Damien Elmes
4859778d2c preserve old default card-level formatting 2011-01-21 06:41:34 +09:00
Damien Elmes
0e08092f65 disable callable replacement which isn't supported on older pythons 2011-01-20 05:32:30 +09:00
Damien Elmes
f945e60d6d when renaming fields, look for the non-space version instead 2011-01-19 05:17:39 +09:00
Damien Elmes
0fc662a919 don't try to delete normalized version 2011-01-19 02:34:13 +09:00
Damien Elmes
bd7f5787cc fix a bug with relativeDelay not being set on card answer 2011-01-19 01:18:27 +09:00
Damien Elmes
d57a371ca5 bump version 2011-01-18 04:33:16 +09:00
Damien Elmes
b8711fe853 fix win32 audio issue when temp dir has foreign chars 2011-01-18 02:22:55 +09:00
Damien Elmes
e55d4768a3 normalize for check, but not for db 2011-01-18 01:18:29 +09:00
Damien Elmes
98fb0f5bb9 apply selective study to review early 2011-01-17 01:36:19 +09:00
Damien Elmes
3d5a427f85 fix include&exclude tags case 2011-01-14 23:08:09 +09:00
Damien Elmes
0a9c498cbd fix media db check on non-unicode dir 2011-01-14 22:50:03 +09:00
Damien Elmes
276ec634b9 ignore new cards in hiddenCards() 2011-01-14 19:03:02 +09:00
Damien Elmes
f7a813831c don't error out if sound is missing on win32 2011-01-14 05:28:32 +09:00
Damien Elmes
ab5c1621e3 bump version 2011-01-14 02:54:53 +09:00
Damien Elmes
29a53b268f strip qt's rtl marker 2011-01-14 00:31:07 +09:00
Damien Elmes
31df2fac01 work around osx decomposing files on HFS+ partitions. sigh. 2011-01-13 23:32:25 +09:00
Damien Elmes
eec317bfc3 work around mplayer on win32 not handling foreign characters 2011-01-13 21:27:35 +09:00
Damien Elmes
149fbee33e fix new-style template replacement; support cond rendering 2011-01-13 20:00:35 +09:00
Damien Elmes
cdcde2f2d3 fix unicode warning when invalid template message given 2011-01-13 19:43:38 +09:00
Damien Elmes
9b7a55d964 remove some old indices 2011-01-13 19:21:40 +09:00
Damien Elmes
0b07707e68 make sure we don't try to send the queues when bundling deck 2011-01-13 07:55:39 +09:00
Damien Elmes
bef86bdbf3 make sure default font sizes are set on upgrade 2011-01-13 06:21:23 +09:00
Damien Elmes
5c0421b6e0 bump version 2011-01-13 05:54:41 +09:00
Damien Elmes
3fe6167d7f Revert "temp hack to prevent latex generation on ankiweb"
This reverts commit a334f839b8.

fixed on the server side now
2011-01-13 05:25:20 +09:00
Damien Elmes
fdd88080c8 work around ankidroid getbool bug 2011-01-13 05:25:05 +09:00
Damien Elmes
3f5befc2e7 don't alter lastSync on upgrade 2011-01-13 04:20:37 +09:00
Damien Elmes
a334f839b8 temp hack to prevent latex generation on ankiweb 2011-01-12 20:36:12 +09:00
Damien Elmes
175f3f0a0e bump version 2011-01-12 16:31:02 +09:00
Damien Elmes
46a441fc0b remove obsolete bulk fetching 2011-01-10 19:26:43 +09:00
Damien Elmes
c534362071 bump version 2011-01-10 19:02:33 +09:00
Damien Elmes
9af5d4d5ed apply limit to new card count 2011-01-10 18:58:59 +09:00
Damien Elmes
87ffbedf16 remove unused clause in earliestTime() 2011-01-09 15:23:09 +09:00
Damien Elmes
2ca1627add use cardLimit() in cardsDueBy(), not just earliestTime() 2011-01-09 15:13:33 +09:00
Damien Elmes
82231a71b2 bump version 2011-01-07 21:43:13 +09:00
Damien Elmes
7cb17e6e8d restart mplayer if it's died 2011-01-07 21:42:24 +09:00
Damien Elmes
2ca27d389f fix local syncing 2011-01-07 13:35:15 +09:00
Damien Elmes
2e2d93649e bump version 2011-01-06 14:24:30 +09:00
Damien Elmes
1f34abc003 more fixes for skewed clocks
if a client with a clock greater than server time synced a deck, the modified
time ended up higher than lastSync when the deck was modified on the server.
instead we force the modified time to be <= the server time, which is known
correct.
2011-01-04 15:51:24 +09:00
Damien Elmes
d717be8849 move to a thread event to fix race condition
The old conditional objects had a problem where the calling code was
notifyAll()ing before the helper threads had started waiting.
2011-01-04 12:32:33 +09:00
Damien Elmes
3a7f8fdc7a change win32 mplayer testing location 2011-01-04 11:59:24 +09:00
Damien Elmes
33cbbdc368 bump version number 2011-01-03 13:46:27 +09:00
Damien Elmes
5a9c75dfe4 don't stop audio playing on clear 2011-01-03 13:01:05 +09:00
Damien Elmes
a4df210667 add group_concat compat code from wm port 2011-01-02 22:17:34 +09:00
Damien Elmes
545c2cddcd bump version 2011-01-02 19:25:27 +09:00
Damien Elmes
b235461d8b space cards to next session if per-day off 2011-01-02 17:43:53 +09:00
Damien Elmes
b45f071581 option to limit graphs to selective study 2011-01-02 17:36:11 +09:00
Damien Elmes
329ab99ff7 add seen card count back for plugins 2011-01-02 13:05:18 +09:00
Damien Elmes
d56bddea2d refactor sound code
this addresses a bug where mplayer was sometimes not being restarted when
opening a new deck, and should remove the need for atexit or hacks in the GUI
code to make sure mplayer is closed
2010-12-28 03:53:30 +09:00
Damien Elmes
ece9b2eccd don't limit failed cards to 0 when cramming 2010-12-27 21:39:20 +09:00
Damien Elmes
a18abb0f97 add timestamp to recording files 2010-12-27 04:32:25 +09:00
Damien Elmes
6f10c588f6 bump version number 2010-12-27 03:01:39 +09:00
Damien Elmes
a2606dd70a remove some unused calls 2010-12-26 07:35:20 +09:00
Damien Elmes
9890c77514 update finished screen to use blanket inactive/suspended msg 2010-12-26 07:29:31 +09:00
Damien Elmes
856839e055 include reviews in spaced card count; bold text 2010-12-26 06:01:24 +09:00
Damien Elmes
63106578cd don't decrement due counts when spacing
This works fine if the user is showing all cards, but if they have limited
reviews to certain categories, it can result in the counts going negative
because we decremented for cards which weren't actually due. Determining if a
card was actually due or not is an expensive operation, so instead we leave
the counts alone and make sure reviews will finish early if the new/rev counts
are non-zero but the queue is empty.
2010-12-26 05:54:05 +09:00
Damien Elmes
93a67931da bump version number 2010-12-25 12:49:31 +09:00
Damien Elmes
ff5bc72121 pass in a 0 timediff if using stock sync() 2010-12-25 12:43:35 +09:00
Damien Elmes
f0bf1989bc new code to download remote links and replace with local ones 2010-12-25 12:42:28 +09:00
Damien Elmes
50622a3127 encode latex after everything else 2010-12-22 08:06:44 +09:00
Damien Elmes
61812b173d mention syncing disabled case 2010-12-21 23:58:36 +09:00
Damien Elmes
ee7da2bd65 update comment 2010-12-21 06:41:42 +09:00
Damien Elmes
afa34d9d39 bump version 2010-12-21 01:45:17 +09:00
Damien Elmes
425789535f don't trim whitespace in sections 2010-12-20 00:37:16 +09:00
Damien Elmes
5c4d7b1789 don't include http/ftp links in media db 2010-12-17 21:29:48 +09:00
Damien Elmes
7c45bab35a rate-limit sync progress messages for win32 installs with huge net bufs 2010-12-17 21:04:47 +09:00
Damien Elmes
ca07cb8f26 don't dump upgrade notices on stderr if not attached to gui 2010-12-17 04:27:12 +09:00
Damien Elmes
400ca9a8a2 factor in time difference when determining common point 2010-12-17 03:55:04 +09:00
Damien Elmes
6860f64f28 try to recover tags of card, too 2010-12-17 02:03:35 +09:00
Damien Elmes
1b219679b6 bump version 2010-12-17 01:48:01 +09:00
Damien Elmes
5eb00296d5 always space rev cards to the next day 2010-12-17 01:46:14 +09:00
Damien Elmes
7065abcf4f only collapse failed cards after cutoff updated 2010-12-16 22:23:51 +09:00
Damien Elmes
e4447818ff make sure learn more considers inactive cards 2010-12-16 04:28:31 +09:00
Damien Elmes
acb72327b2 don't leave stale entries in media db if just scanning 2010-12-16 01:42:12 +09:00
Damien Elmes
4e5b725166 and make sure xhtml syntax works too 2010-12-16 01:22:23 +09:00
Damien Elmes
2a629a179d add missing trailing > to img regexp 2010-12-16 01:12:45 +09:00
Damien Elmes
907fa5c80e tweak spaceCards() 2010-12-15 04:46:40 +09:00
Damien Elmes
d2e3d7932d bump version 2010-12-15 03:53:02 +09:00
Damien Elmes
0363cc70f4 preserve more of the old formatting on upgrade
because field formatting is always on now, users with custom font
sizes/families set only on the card will still have to alter their templates
and either configure the fields or replace the references with triple
curly braces
2010-12-15 03:52:18 +09:00
Damien Elmes
09b017bb24 not sorting on combinedDue anymore, so don't bother with that upgrade step 2010-12-15 02:03:12 +09:00
Damien Elmes
9ed9ec79cc make them case-insensitive too 2010-12-13 06:56:04 +09:00
Damien Elmes
525f44c9c5 more robust img regexp 2010-12-13 06:54:40 +09:00
Damien Elmes
7ce661ac63 place cards with corrupt/missing facts into new fact instead of deleting 2010-12-13 06:46:20 +09:00
Damien Elmes
154bf0cef4 bump version 2010-12-13 04:09:55 +09:00
Damien Elmes
0a01d9f867 make latex preamble easier to read 2010-12-13 03:21:05 +09:00
Damien Elmes
d0c6db0d62 only regenerate indices once during upgrade from 1.0 2010-12-13 02:29:21 +09:00
Damien Elmes
d14761b428 sort new cards by due not combinedDue; index optimizations
- ensure queue filling selects can be satisfied by index alone
- sort by due instead of combinedDue so we can decouple card order from
  new spacing
2010-12-13 02:25:39 +09:00
Damien Elmes
5de6bb57ed auto-analyze when we've updated a dynamic index 2010-12-13 00:26:34 +09:00
Damien Elmes
902800de99 answers exceeding 60 seconds now log the full 60 instead of 0 2010-12-12 02:00:06 +09:00
Damien Elmes
cc8dbccf38 don't set combinedDue twice in answerCard 2010-12-12 00:09:40 +09:00
Damien Elmes
49b744f77d limit plugin warning to once a session 2010-12-11 22:04:24 +09:00
Damien Elmes
98597dd56d bump version 2010-12-11 22:01:07 +09:00
Damien Elmes
58b20b0626 make sure subprocess is available so we can set startupinfo 2010-12-11 18:36:01 +09:00
Damien Elmes
7ab5a53e38 remove superfluous 0 2010-12-11 17:02:51 +09:00
Damien Elmes
98304accb0 return actual checksum, or sqlite tries to treat it like an int 2010-12-11 16:30:26 +09:00
Damien Elmes
35fd3de6fb reset if there were buried cards, since updatePriorities() doesn't 2010-12-11 15:55:22 +09:00
Damien Elmes
59df94ff74 add compat code for fact.setModified() 2010-12-11 12:54:30 +09:00
Damien Elmes
9f276e3163 bump version 2010-12-11 02:33:25 +09:00
Damien Elmes
e3838464a2 use rec instead of tmp for recording name 2010-12-11 02:20:36 +09:00
Damien Elmes
f42a2e4a00 rebuild q/a cache to include latex 2010-12-11 02:17:00 +09:00
Damien Elmes
7a196b3747 don't bother to return used media 2010-12-11 02:13:37 +09:00
Damien Elmes
70eb44bce2 latex improvements
- move latex preamble into a deck var and include amsmath by default
- include the pre/postamble in the hash, so changes to the preamble result in
  newly generated images
2010-12-11 02:05:00 +09:00
Damien Elmes
b0f300bb74 fix latex generation bug caused my mediaDir() always chdiring now 2010-12-11 01:46:29 +09:00
Damien Elmes
4d2d9eab81 generate latex at fact modification, not review
- latex now slots in to the formatQA hook to render images in the q/a
- moved call() to utils
- cache/uncache latex have been obsoleted. User can delete manually, and
  images will be regenerated with a DB check
2010-12-11 01:40:49 +09:00
Damien Elmes
0c9672e7b8 rewrite media support
- media is no longer hashed, and instead stored in the db using its original
  name
- when adding media, its checksum is calculated and used to look for
  duplicates
- duplicate filenames will result in a number tacked on the file
- the size column is used to count card references to media. If media is
  referenced in a fact but not the question or answer, the count will be zero.
- there is no guarantee media will be listed in the media db if it is unused
  on the question & answer
- if rebuildMediaDir(delete=True), then entries with zero references are
  deleted, along with any unused files in the media dir.
- rebuildMediaDir() will update the internal checksums, and set the checksum
  to "" if a file can't be found
- rebuildMediaDir() is a lot less destructive now, and will leave alone
  directories it finds in the media folder (but not look in them either)
- rebuildMediaDir() returns more information about the state of media now
- the online and mobile clients will need to to make sure that when
  downloading media, entries with no checksum are non-fatal and should not
  abort the download process.
- the ref count is updated every time the q/a is updated - so the db should be
  up to date after every add/edit/import
- since we look for media on the q/a now, card templates like '<img
  src="{{{field}}}">' will work now
- export original files as gone as it is not needed anymore
- move from per-model media URL to deckVar. downloadMissingMedia() uses this
  now. Deck subscriptions will have to be updated to share media another way.
- pass deck in formatQA, as latex support is going to change
2010-12-11 01:19:31 +09:00
Damien Elmes
75da977026 bump version 2010-12-09 18:01:16 +09:00
Damien Elmes
27ca04fab6 support a media prefix 2010-12-09 15:34:01 +09:00
Damien Elmes
84a98550f0 always change cwd to media dir 2010-12-09 12:55:00 +09:00
Damien Elmes
1bbffec0d6 abort download missing media early; remove obsolete forceMediaDir 2010-12-09 12:53:01 +09:00
Damien Elmes
e5d9697d28 don't break older clients with new delay1 setting 2010-12-09 12:00:00 +09:00
Damien Elmes
cdac2bf8d7 workaround card ordering bug from older versions 2010-12-09 10:43:45 +09:00
Damien Elmes
7fc593a2ce fix tag update 2010-12-08 17:05:19 +09:00
Damien Elmes
3491a5e378 add an index for modified to speed up sync.summary()
testing indicates this can produce a 2x performance improvement on lastSync=0,
and much more for partial syncs
2010-12-08 15:59:16 +09:00
Damien Elmes
fe97616ecd add temporary index for priority 2010-12-08 15:38:06 +09:00
Damien Elmes
05f60c49c8 add rebuild arg for minimal startup
this bypasses rebuilding the queue and other startup initialization and thus
loads the deck considerably faster. This is useful when you want to perform
operations on the deck like syncing, but don't need the ability to review
cards
2010-12-08 15:28:28 +09:00
Damien Elmes
878c9abb83 bump version 2010-12-07 18:04:53 +09:00
Damien Elmes
9f91e904b2 re-enable locked check 2010-12-07 17:18:17 +09:00
Damien Elmes
1a5c8d2435 fix from marcus for "field":value search 2010-12-07 17:13:25 +09:00
Damien Elmes
0194296839 failed cards at end if !delay0 && !failedCardMax 2010-12-07 16:55:03 +09:00
Damien Elmes
a383223e02 provide more info in sync error messages; catch zlib decode errors 2010-12-07 16:48:49 +09:00
Damien Elmes
2013e7e4ff conditional delete of css 2010-12-07 14:35:16 +09:00
Damien Elmes
15763f8f3c make sure we don't commit during a sync
updateDynamicIndices() is done on next deck load anyway
2010-12-07 11:59:02 +09:00
Damien Elmes
039af66a9d don't rebuild counts in applyPayload(), as the deck will be reopened 2010-12-07 11:56:43 +09:00
Damien Elmes
4c8f2d3b47 add finish() command to sync protocol 2010-12-07 11:02:23 +09:00
Damien Elmes
0af8da9cb8 sync updates
- set lastSync on successful upload, not before it
- make sure source file is closed
- use v2 sync protocol
2010-12-07 09:20:31 +09:00
Damien Elmes
da97701b2d disable lastSync fudging again 2010-12-07 09:19:09 +09:00
Damien Elmes
2a8ef89ee5 remove unused binding 2010-12-07 07:26:33 +09:00
Damien Elmes
a2cd19f49a tell users how they can disable the move check 2010-12-05 17:43:54 +09:00
Damien Elmes
458357548f more sqlalchemy workarounds 2010-12-02 23:38:06 +09:00
Damien Elmes
a23098c92c bump version 2010-12-02 09:55:06 +09:00
Damien Elmes
9259718fd5 set syncName after full download 2010-12-02 07:23:54 +09:00
Damien Elmes
7dd57887d0 update learn more for new spacing 2010-12-02 06:48:45 +09:00
Damien Elmes
b5dd8a9f4b update cram code for new spacing 2010-12-02 06:47:16 +09:00
Damien Elmes
bac4acdaa8 reworked handling of spaced cards; add cms argument to previewFact()
- obsolete spaceUntil - it serves no useful purpose
- the old per-model spacing variables are obsolete, as the new approach
  requires uniform spacing across all models for new cards
- introduce a new per-deck variable: newSpacing
- don't fill new queue if we've done today's cards
- still need to check cramming / review early

newSpacing is a time in seconds to delay introduction of sibling new cards.
It can be applied as many times as necessary as there is no harm in new cards
being delayed repeatedly. Because the default queue length is 200 and it can
take quite some time for the spaced cards to be placed in the queue again, we
use a separate array to track spaced new cards provided the configured delay
is less than 20 minutes. At times under 20 minutes this number is not a
guaranteed minimum spacing - if the new card queue is empty the spaced cards
will be flushed before checking the new queue again, as otherwise we end up
trying to fill on every repetition. The due counts no longer decrease by more
than one if the spacing is less than the due cutoff, since that confused some
users.

Review cards are now placed at the end of the current review queue, and will
never be rescheduled to a different day. The old approach had a number of
problems:

- the more card models you had, the more likely a card would be spaced
  multiple times, resulting in you forgetting the card before you get a chance
  to review it
- spacing was applied even if the due card was already late
- repeatedly failing one card over a period of days or weeks would also stave
  the other cards of attention
2010-12-02 06:33:40 +09:00
Damien Elmes
53fbc9b3ee if spacing is disabled, don't decrement counts 2010-12-01 02:54:21 +09:00
Damien Elmes
bb901dfa16 make sure all fields have a font set 2010-12-01 02:42:13 +09:00
Damien Elmes
9fed5e2bc1 work around sqlalchemy problem 2010-12-01 01:21:05 +09:00
Damien Elmes
2352502807 bump version 2010-11-30 03:35:45 +09:00
Damien Elmes
ae388595da add whitespace preservation flag; only show active card models when previewing 2010-11-30 03:28:08 +09:00
Damien Elmes
a5af8fb8e9 convert pystache to private library since it doesn't behave like upstream 2010-11-29 22:51:55 +09:00
Damien Elmes
da1cfa52b1 mention editFontFamily unused 2010-11-29 22:33:05 +09:00
Damien Elmes
b349a96fa5 drop most of the per-card formatting 2010-11-29 22:27:19 +09:00
Damien Elmes
74a0998a36 bump version 2010-11-28 18:21:00 +09:00
Damien Elmes
255deb9e9e elaborate on debug msg 2010-11-28 18:14:09 +09:00
Damien Elmes
689a744266 bump version 2010-11-28 02:32:59 +09:00
Damien Elmes
850d883ab4 update rest of code to recognize&use new rendering 2010-11-28 02:26:53 +09:00
Damien Elmes
ac8f613aca use pystache for template rendering; autoconvert old style for now 2010-11-28 02:06:54 +09:00
Damien Elmes
f247133ed8 make syncName work with foreign chars 2010-11-27 13:14:16 +09:00
Damien Elmes
ca9aeaa086 don't allow mature delay over a week for now; fix delay being reset to 0 2010-11-26 23:35:26 +09:00
Damien Elmes
386de21f87 don't fudge matplotlib path on win32 2010-11-26 21:59:09 +09:00
Damien Elmes
e58d7f8dac bump version 2010-11-26 04:20:40 +09:00
Damien Elmes
84b99b1ae5 don't allow tags to be prefixed with a colon, as this breaks sqlite 2010-11-26 03:49:01 +09:00
Damien Elmes
3aa787a146 remove print statement 2010-11-26 03:39:58 +09:00
Damien Elmes
00087ed101 find duplicates support 2010-11-26 03:26:02 +09:00
Damien Elmes
d539018137 support multiple facts in fid: query 2010-11-26 03:25:32 +09:00
Damien Elmes
367143f4f3 make sure to set cards as not due when resetting/rescheduling for old clients 2010-11-26 01:49:10 +09:00
Damien Elmes
f4a35e9b03 support tags: at the top of file to import; fix comment stripping 2010-11-26 01:48:54 +09:00
Damien Elmes
e3dd736460 add ability to update fields when importing 2010-11-26 01:36:24 +09:00
Damien Elmes
dd00d1a5e1 when rebuilding tag priorities, don't include obsolote suspended 2010-11-25 21:56:08 +09:00
Damien Elmes
8f18299cc5 typo 2010-11-24 05:39:06 +09:00
Damien Elmes
f698481c19 don't keep changing the hard interval on load
only adjust it if it looks like the defaults haven't been changed
2010-11-24 05:32:09 +09:00
Damien Elmes
6bdca8b3c6 fix available card limiting when using %(tags)s, %(cardModel), etc 2010-11-24 05:14:07 +09:00
Damien Elmes
45dfc97e9f add axis labels to graphs
note that due to limitations in the graphing library, these can't be
translated at the moment.
2010-11-24 05:09:00 +09:00
Damien Elmes
33567edb3e numerous graph changes
- use bar graphs instead of line graphs for 3 months or less
- easier to read shades of blue for reps graph
- simplify day cutoff calculation
- fix off by one bug in work done data
- add missing entries when calculating cumulative due
2010-11-24 04:30:55 +09:00
Damien Elmes
7491cfc521 new syncName handling
- the local deck name must now match the online deck
- syncName is a hash of the current deck's path or None
- the hash is checked on deck load, and if it is different (because the deck
  was copied or moved), syncing is disabled. This should prevent people from
  accidentally clobbering their online decks
2010-11-23 23:12:34 +09:00
Damien Elmes
6ec898ca4b Require explicit reset for most queue-modifying functions
When you call operations like deleteCards(), suspendCards() and so on, it is
now necessary to call deck.reset() afterwards. This allows the calling code to
delay a reset if necessary. If the calling code calls a function that says the
caller must reset, the caller should be sure to call .reset() and fetch the
current card again. Failure to do the latter will result in answerCard()
attempting to remove the card from the queue, when the queue has been cleared.
2010-11-23 17:41:36 +09:00
Damien Elmes
943c9a0e5f make sure the finished message displays cards due tomorrow 2010-11-23 15:33:54 +09:00
Damien Elmes
03503cd9b9 fix cram from ids case 2010-11-22 08:09:20 +09:00
Damien Elmes
b03f30c279 no need to adjust hardInterval in upgrade; handled in deck open 2010-11-21 14:24:46 +09:00
Damien Elmes
76135dc8be updated failed card handling when cramming
- temp suspend all answered cards, regardless of type
- fails influence the standard scheduling too
2010-11-21 13:39:28 +09:00
Damien Elmes
37e269ab81 bump version for coming development release 2010-11-21 12:58:14 +09:00
Damien Elmes
937d6a6513 update earliestTime() for new failed cards handling 2010-11-21 12:32:58 +09:00
Damien Elmes
b4493f0ec8 user may set young delay to more than a day 2010-11-21 12:25:54 +09:00
Damien Elmes
8e9d14a0fd avoid passing the second fade argument, as it seems to be more robust 2010-11-16 18:04:04 +09:00
Damien Elmes
c2f2225b7f update combinedDue for the current card object, not just for the db 2010-11-16 11:27:27 +09:00
Damien Elmes
0afec850c0 on second thought, avoid suspended cards or this will bite us in the future 2010-11-15 14:29:52 +09:00
Damien Elmes
1cd5125d4e remove the rest of the obsolote rebuildTypes() code 2010-11-15 14:27:52 +09:00
Damien Elmes
26470c997e remove unused where clause from rebuildTypes() 2010-11-15 14:07:13 +09:00
Damien Elmes
6d2e32e2df finished message should use cutoff + 24hrs 2010-11-14 08:16:07 +09:00
Damien Elmes
6f8a5d6a24 fix wrong priority code in rebuildTypes() 2010-11-14 08:11:28 +09:00
Damien Elmes
aa753d35a5 don't include suspended cards in graphs 2010-11-14 07:37:51 +09:00
Damien Elmes
1f8adc791a a few failed cards related fixes
- make sure cardLimit() matches on sql statements that are broken over lines
- fix logic in getCardId()
- don't increment failed count if delay1>0 and card was mature
2010-11-13 21:39:52 +09:00
Damien Elmes
7502fba5ce change failed card handling
The old delay1 behaviour isn't easy to achieve with the queue code, as we only
refresh the queue when it's emptied, and if the user has delay1 set to say 9
hours, failed mature cards sitting in the queue could prevent subsequent young
failures from being displayed. Instead we convert delay1 to a count in days in
which to offset failed mature cards. 0 means the same time as delay0, 1 means
show the card a day later, and so on. This means users will lose the ability
to delay mature cards for x number of minutes more than young cards, but a
scan of AnkiOnline decks indicates that's not often done.

We also need to use a separate cutoff for failed cards, since we need to be
able to display them as they expire if the user has disabled per-day
scheduling.

And instead of marking cards as due in the future, we set their due time to
the current time, and move the delay0 calculation to getCardId(). This means
that if the user changes their failed card settings from say 1 hour to 10
minutes, the changes apply to the currently failed cards and not just cards
failed in the future.
2010-11-13 21:15:41 +09:00
Damien Elmes
b69fd48768 more type handling updates; don't munge counts on sync
In various parts of the code we need to get all cards of a given category
(new, failed, etc) regardless of whether they're suspended, buried, etc. So we
store the true type in the obsolete relativeDelay column and add in index for
it, because it's cheaper than putting indices on reps & successive.
2010-11-13 18:39:24 +09:00
Damien Elmes
268d2645fd delete cards that have the wrong card model 2010-11-13 16:33:39 +09:00
Damien Elmes
274017036a add sanity limits to cutoff calculation 2010-11-13 12:00:01 +09:00
Damien Elmes
4a35dbe6b2 python2.7/win32 fix for latex 2010-11-12 13:05:43 +09:00
Damien Elmes
919353c57d only require due to be past cutoff if the card was passed 2010-11-12 12:51:53 +09:00
Damien Elmes
3a7f343464 fix typo - been writing too much javascript lately! 2010-11-12 12:50:07 +09:00
Damien Elmes
1b411938bf add inactive argument to cramCardTags() so it performs like standard 2010-11-12 12:49:30 +09:00
Damien Elmes
6ed0bc91bb update sync url 2010-11-08 09:22:36 +09:00
Damien Elmes
9d6b0f35f4 ensure cards are scheduled past cutoff, more
- because the cutoff adds a few hours past midnight, it's possible for a card
  that's scheduled for 1.0 days ahead to fall within the current cutoff, so we
  need to make sure that doesn't happen
- set spaceUntil=0 when answering card again
- fix randomizeNewCards() query. the whole codebase needs auditing for type
  references which need updating
2010-11-07 06:48:35 +09:00
Damien Elmes
61610d8351 adjust some queries so sqlite uses the correct index 2010-11-06 08:57:47 +09:00
Damien Elmes
e0d46f0f12 be resilient if spaceUntil sent wrong 2010-11-06 07:50:05 +09:00
Damien Elmes
328a1a86a4 make sure we reset rev early cards too on deck load 2010-11-06 06:03:34 +09:00
Damien Elmes
172505a707 fix broken card type calculation in error msg 2010-11-05 02:40:30 +09:00
Damien Elmes
4c50729946 temp debug info for requeueCard() 2010-11-04 02:32:37 +09:00
Damien Elmes
b766a9164e fix thinko in previous answerCard() update 2010-11-04 02:28:08 +09:00
Damien Elmes
4524fd84fe collapse spacing when cramming 2010-11-04 02:23:15 +09:00
Damien Elmes
cc12c8c573 need to rebuild counts when cutoff updated 2010-11-04 01:51:16 +09:00
Damien Elmes
0535f0561c redundant code in answerCard() 2010-11-03 23:45:44 +09:00
Damien Elmes
3f3f797348 don't space failed cards; make sure card type is calculated after stats update 2010-11-03 00:29:56 +09:00
Damien Elmes
46790f2e92 remove (incorrect) code in sync, is covered on deck load anyway 2010-11-02 22:34:10 +09:00
Damien Elmes
a68334220a fix suspensions 2010-11-02 22:30:57 +09:00
Damien Elmes
73119c93cf restore inactive tags with a more efficient query 2010-11-02 02:33:13 +09:00
Damien Elmes
37c15a320e make sure we don't fail if attempting to reset revearly cards before upgrade 2010-11-02 02:04:54 +09:00
Damien Elmes
2c5ac66083 type/priority changes, cram/rev early refactor, more
* Adjust type to remove cards from the queues, so we don't have to rebuild
  priorities to restore them:

Type -= 3 when suspending
Type += 3 when burying
Type += 6 when cramming / reviewing early

We still need to adjust priorities for backwards compatibility, but this can
be removed in the future.

* Factor out scheduler-specific code in answerCard(), so the different
  schedulers are now fully modular

* Differentiate between a card's current queue and its type

* Make sure dueCutoff cuts off at the chosen offset instead of midnight
2010-11-02 01:59:20 +09:00
Damien Elmes
785ddc3786 make sure to set card limit on scheduler change 2010-10-31 18:59:49 +09:00
Damien Elmes
ce82861357 make sure to update field cache when adding fact 2010-10-31 18:17:49 +09:00
Damien Elmes
c4a1f807ec update cram for new cardActive() handling 2010-10-31 18:12:16 +09:00
Damien Elmes
cc8f619458 remove support for inactive tags
Unlike active tags, they are not able to be implemented efficiently, and they
duplicate the functionality of manually suspending cards
2010-10-29 21:31:40 +09:00
Damien Elmes
2967819882 fix fid queries 2010-10-29 19:41:40 +09:00
Damien Elmes
621d11a6da don't generate cards if the question is blank, again 2010-10-29 01:05:33 +09:00
Damien Elmes
7e6f4907b0 make sure we don't count/grab cards multiple times 2010-10-28 20:33:19 +09:00
Damien Elmes
46ba2db87a use new field cache so we can ignore html in std search 2010-10-27 21:22:29 +09:00
Damien Elmes
731c4100f9 wrap the remaining really long lines 2010-10-27 21:06:45 +09:00
Damien Elmes
4cce768c70 update search code for new scheduler 2010-10-27 21:03:48 +09:00
Damien Elmes
8c7322c974 merge marcus' searching code 2010-10-27 20:54:42 +09:00
Damien Elmes
34d6efe1df marcus: handle html entities properly when stripping html 2010-10-27 20:12:00 +09:00
Damien Elmes
8ce0ff5b8b add a field cache for searching without html 2010-10-27 19:00:49 +09:00
Damien Elmes
9f9841cb22 use a join instead of a subquery as sqlite can optimize it better 2010-10-26 20:21:59 +09:00
Damien Elmes
c50b7e61cb new indices, make sure to set type when reviewing early
- new type, combinedDue for failed cards & count checks
- only reset() on deck load if not already done
- remove isDue from dynamic indices but leave old ones around for now
2010-10-26 20:10:05 +09:00
Damien Elmes
ea3bf14019 if using no points of precision, take the floor 2010-10-26 12:54:58 +09:00
Damien Elmes
5bc7c390a0 make sure to respect failed card timing, fix default hard times 2010-10-26 11:46:35 +09:00
Damien Elmes
27b7ccb41f set deck vars before updating the cutoff 2010-10-25 15:46:58 +09:00
Damien Elmes
71de076309 no need to adjust types when rebuilding priorities 2010-10-25 15:38:50 +09:00
Damien Elmes
c1d79b856f superfluous rowcount 2010-10-25 15:36:43 +09:00
Damien Elmes
33e6a17141 make sure to set isDue=0 for spaced cards too, for backwards compat 2010-10-25 15:28:59 +09:00
Damien Elmes
b0e4748a1c make sure to update combinedDue with the new value 2010-10-25 14:35:05 +09:00
Damien Elmes
de18f59474 compat hack for suspended cards on older platforms 2010-10-24 14:21:21 +09:00
Damien Elmes
1f20442921 require dingsbums decks to use a different name so we don't conflict 2010-10-24 13:26:51 +09:00
Damien Elmes
ecc99780e4 add bury support 2010-10-24 13:06:16 +09:00
Damien Elmes
1d89be0a1e make sure to set isDue=0 when answering a card for compatibility reasons 2010-10-24 13:01:13 +09:00
Damien Elmes
4c76d25b05 remove obsolete 'inactive' from findCards() 2010-10-24 12:55:33 +09:00
Damien Elmes
a3040d1fb4 suspend leeches after they've been removed from the queue 2010-10-24 12:32:40 +09:00
Damien Elmes
fbae42d8ef tweak deck stats for new scheduling 2010-10-24 12:26:18 +09:00
Damien Elmes
1e2d88dccf make sure to consider active tags when calculating next due card 2010-10-24 11:47:47 +09:00
Damien Elmes
057414f404 use same active/inactive limits for failed queue 2010-10-23 16:15:42 +09:00
Damien Elmes
d1f1f914ad python2.7 win32 compat fix 2010-10-23 13:58:03 +09:00
Damien Elmes
df2ae3b63b give each scheduler a name 2010-10-20 18:03:10 +09:00
Damien Elmes
94ad0cb95e new cram code, remove refs to inactive cards
- cramming is now a separate scheduler type
- correctly answering a card while cramming causes its scheduling to be
  changed in the standard review too
- options to sort cards by earliest modified, ordered, random
- render priority 0 obsolete, as it's all done at queue generation time now
2010-10-20 13:12:17 +09:00
Damien Elmes
30a6f04708 make queue limit configurable, fix bulk fetching of cards for ankionline 2010-10-19 19:45:57 +09:00
Damien Elmes
b7e3d87e5d new active/inactive handling, bigger queues
- separate categories for new & review cards
- 'only these tags' + 'none of these tags'
2010-10-19 19:17:52 +09:00
Damien Elmes
be4dea39b1 more scheduler updates
- reimplement reviewEarly and newEarly by replacing parts of the scheduler,
  instead of adding special conditions
- remove references to isDue and priority (1,2,3,4) which is not necessary
  anymore
- add option to switch between per-day scheduling and due now scheduling
- newCardsToday() -> newCardsDoneToday()
- don't decrement counts for suspended cards
- make sure to update type when suspending/unsuspending
- fix findCards()
- set hardInterval = 1-1.1 on upgrade, or the default per day scheduling doesn't
  make sense
2010-10-18 18:01:19 +09:00
Damien Elmes
ad743d850d start work on scheduling refactor
Previously we used getCard() to fetch a card at the time. This required a
number of indices to perform efficiently, and the indices were expensive in
terms of disk space and time required to keep them up to date. Instead we now
gather a bunch of cards at once.

- Drop checkDue()/isDue so writes are not necessary to the DB when checking
for due cards
- Due counts checked on deck load, and only updated once a day or at the end
of a session. This prevents cards from expiring during reviews, leading to
confusing undo behaviour and due counts that go up instead of down as you
review. The default will be to only expire cards once a day, which represents
a change from the way things were done previously.
- Set deck var defaults on deck load/create instead of upgrade, which should
fix upgrade issues
- The scheduling code can now have bits and pieces switched out, which should
make review early / cram etc easier to integrate
- Cards with priority <= 0 now have their type incremented by three, so we can
get access to schedulable cards with a single column.
- rebuildQueue() -> reset()
- refresh() -> refreshSession()
- Views and many of the indices on the cards table are now obsolete and will
  be removed in the future. I won't remove them straight away, so as to not
  break backward compatibility.
- Use bigger intervals between successive card templates, as the previous
intervals were too small to represent in doubles in some circumstances

Still to do:

- review early
- learn more
- failing mature cards where delay1 > delay0
2010-10-18 14:35:11 +09:00
Damien Elmes
747a28556a when determining which card templates to use, replace text: too 2010-10-18 11:34:02 +09:00
Damien Elmes
8df9111b50 only copy used media on import/export 2010-10-16 10:29:39 +09:00
Damien Elmes
e010ef8062 add clock skew compensation again
this has the negative effect of causing multiple full syncs if syncing
multiple times within a 5 minute period of the previous full sync, but it
makes it much less likely that people's due counts will fall out of sync
2010-10-02 14:47:33 +09:00
Damien Elmes
99ba3f09c8 catch missing facts at end of sync 2010-09-12 12:21:39 +09:00
Damien Elmes
1f239c1e67 direct user to help page when file not in utf-8 2010-09-02 11:45:33 +09:00
Damien Elmes
ea32bce31c support escaped quotes in csv file, ignore bom marker 2010-08-30 20:40:28 +09:00
Damien Elmes
4437024ecc fix a bug caused by sqlite not understanding unicode case 2010-08-26 18:38:08 +09:00
Damien Elmes
c916478868 bump version number 2010-08-19 13:42:19 +09:00
Damien Elmes
cb533d9c02 don't die when filename case is borked in media check 2010-08-16 19:28:45 +09:00
Damien Elmes
9332444dfd add hook for when undo is finished 2010-08-16 19:27:00 +09:00
Damien Elmes
84cb81854b faster tag updating for large number of tags 2010-08-16 18:52:55 +09:00
Damien Elmes
ff60f105d9 add extra minor version number to ensure betas get upgraded 2010-08-02 13:26:48 +09:00
Damien Elmes
5e7c62bca5 don't compensate for clock skew 2010-07-30 18:15:24 +09:00
Damien Elmes
e956aa9afb remove obsolete function 2010-07-27 22:54:51 +09:00
Damien Elmes
d3fb189a72 improved lastSync/modified handling
- never bump deck mod while syncing
- set lastSync to current time, not deck modified time
- don't update lastSync until the final part of the sync
- lower clock skew allowance to ~5 minutes
- bump full sync threshold to 1000 modified items
2010-07-27 22:46:04 +09:00
Damien Elmes
ecb6dbe69a unicode in error messages 2010-07-26 20:59:56 +09:00
Damien Elmes
55194f8aa7 ensure cardmodel/fieldmodels work when given a string too 2010-07-26 17:15:05 +09:00
Damien Elmes
5fe42791c3 use relative path in latex generation 2010-07-26 17:14:49 +09:00
Damien Elmes
61a7d6d79e make sure we match a given model even when given a string 2010-07-24 14:28:24 +09:00
Damien Elmes
a68366b5c4 fix card ordering when generating cards by basing card creation off fact 2010-07-21 19:46:27 +09:00
Damien Elmes
f3d2965e12 Revert "don't delete dangling facts when deleting cards" hack
We don't need this any more as we do conflict handling.

This reverts commit 880219567e.
2010-07-21 18:37:35 +09:00
Damien Elmes
6852b0acda bump mod time on full sync to server, ensure lastSync matches 2010-07-21 18:37:05 +09:00
Damien Elmes
f58651cf1b bump version number 2010-07-11 17:42:05 +09:00
Damien Elmes
b8401eff22 ignore parse errors due to invalid html on export 2010-06-28 11:52:25 +09:00
Damien Elmes
f03000d27b remove string exceptions for python2.6 2010-06-10 13:24:46 +09:00
Damien Elmes
880219567e don't delete dangling facts when deleting cards
If the user is not careful to only sync when one side has been modified, they
can end up with cards on one side and not the other. If they then delete a
card, deleting the dangling facts also deletes the fact associated with the
not-yet-synced card. In order to avoid this, we avoid deleting dangling facts
until a DB check.
2010-05-21 06:56:38 +09:00
Damien Elmes
edf121f8dc add hex cache for dumb clients, make sure not to mark deck modified 2010-05-16 01:01:38 +09:00
Damien Elmes
5616e679f5 cache the css as a deck var, don't accidentally send it in sync 2010-05-10 21:32:36 +09:00
Damien Elmes
fd1953bfb5 convert to a list, not tuples, so we can modify on the fly 2010-05-07 16:05:35 +09:00
Damien Elmes
f69d946f83 more sqlalchemy compat 2010-05-02 16:15:32 +09:00
Damien Elmes
554d7021e0 don't specify an input index by default 2010-04-21 13:31:59 +09:00
Damien Elmes
a1d3f13f0a update for sqlalchemy 0.6 2010-04-21 13:21:16 +09:00
Damien Elmes
1be5943903 remove erroneous comment 2010-04-16 01:25:47 +09:00
Damien Elmes
21ec548680 more explicit setting of creation time, don't fiddle with ordinals for rand 2010-04-15 23:05:14 +09:00
Damien Elmes
783751d7ea support ? for single char search 2010-04-06 18:47:39 +09:00
Damien Elmes
af66630f07 delay beautifulsoup import until export 2010-04-01 22:57:26 +09:00
Damien Elmes
7f75364fbe delete mediamissing tags before setting 2010-03-28 10:18:13 +09:00
Damien Elmes
465a890bcd don't add = as a delim 2010-03-16 00:39:41 +09:00
Albert Peschar
ed50fb20d9 auto-detect '=' as import delimiter, strip fields 2010-03-14 11:40:31 +01:00
Damien Elmes
c8d9bac5df clarify one way sync error 2010-03-05 09:27:11 +09:00
Damien Elmes
09f51e5028 when adding facts, use a small due increment for each card model 2010-03-03 02:51:05 +09:00
Damien Elmes
80197d9c2f when generating cards, use a small creation date increment 2010-03-03 02:49:55 +09:00
Damien Elmes
27694adf1a patch from Chris Burel, fix qt html rewriting on 4.6.1+ 2010-02-23 17:25:12 +09:00
Damien Elmes
7111b3b924 add attr to tell if fact was pulled from db 2010-02-22 18:00:23 +09:00
Damien Elmes
8a28df1a80 patch from Piotr Kubowicz, fix some translations 2010-02-22 17:07:46 +09:00
Damien Elmes
220670a048 update combinedDue attr in cardAnswered(), not just on disk 2010-02-22 16:41:20 +09:00
Damien Elmes
472b68b831 don't backup when importing / saving as 2010-02-20 10:03:39 +09:00
Damien Elmes
bc345d3711 create backup dir if missing 2010-02-20 09:54:54 +09:00
Damien Elmes
7c8e612704 use a constant for chunk size 2010-02-18 17:36:54 +09:00
Damien Elmes
4769bfa7a5 another hack for w32's low timer resolution 2010-02-12 16:03:48 +09:00
Damien Elmes
6857233eef bump version 2010-02-12 14:40:45 +09:00
Damien Elmes
4a1dd99cc9 bump version 2010-02-09 01:55:01 +09:00
Damien Elmes
6dce4e0602 add progress dialog to save as 2010-02-09 01:52:06 +09:00
Damien Elmes
ae690ccea3 don't bother with an integrity check if the deck is unchanged 2010-02-09 01:36:39 +09:00
Damien Elmes
715c82aba9 remove debugging line in exporting 2010-02-09 01:31:05 +09:00
Damien Elmes
295bacacd8 forget sync name on saveas 2010-02-09 01:30:16 +09:00
Damien Elmes
095a7dbb6f implement save as without attaching a db
Attaching new to old causes old to be implicitly commited.
We also can't access old from new if a write lock has been
taken out, so the only option left is to move all the data
through Python and take the speed hit.
2010-02-09 01:27:49 +09:00
Damien Elmes
dfd88cc4c1 don't set modtime of 0 2010-02-06 01:20:50 +09:00
Damien Elmes
c659660864 don't send acq cards when there are cards to review & new cards shown last 2010-02-05 13:07:42 +09:00
Damien Elmes
09f51e27f0 return newly created card ids when generating cards 2010-02-05 12:59:54 +09:00
Damien Elmes
582a9dd290 don't create empty tags on export 2010-02-05 12:27:32 +09:00
Damien Elmes
187caa874b make sure to remove deck if exists before exporting into it 2010-02-02 00:28:15 +09:00
Damien Elmes
04ba9c9a4e strip elements out of range in review time graph 2010-02-01 07:16:40 +09:00
Damien Elmes
8378f71c73 since interval is updated first, use lastInterval in cardIsBeingLearnt() 2010-02-01 05:11:34 +09:00
Damien Elmes
9b61d86096 place a minimum bound on average factor
Since SM2's grading has a bias towards starting high and going down (fail/hard
decrease the interval more than easy increases it), more conservative users
find their average interval reaches the minimum allowable interval and the
times given by hard/good start to converge. In the future, the whole concept
of using the average interval for new cards should be revisited to see if the
data supports it
2010-02-01 05:01:23 +09:00
Damien Elmes
3106ecd80d change location of matplotlibrc file in frozen distrib 2010-02-01 04:44:39 +09:00
Damien Elmes
d8ba9e1987 revert ease1 change
suspicious of the previous change, I had a look at the example pascal and
found the EF _was_ actually updated on a failure. The spec is misleading there.
2010-02-01 04:44:27 +09:00
Damien Elmes
095ac330b5 fix first-time latex generation in a deck with no media dir 2010-02-01 03:33:13 +09:00
Damien Elmes
87a0e087e5 tweak scheduler
- don't touch factor on fail, as per SM2 specs
- hard code no-punish-on-hard 'learning period' to 7 days so users who tweak
  the initial intervals aren't punished too early
2010-02-01 03:28:46 +09:00
Damien Elmes
863d3d8319 add stripMedia() 2010-01-29 20:20:00 +09:00
Damien Elmes
ec263d0d63 if there is a period, always use the plural 2010-01-29 20:05:04 +09:00
Damien Elmes
9172c9b697 remove obsolete time span pair code 2010-01-29 19:28:38 +09:00
Damien Elmes
c90828349c remove obsolete reference to card tags, don't store card tags on import 2010-01-23 10:59:40 +09:00
Damien Elmes
ea2fa24fed add progress info to card/fact export 2010-01-23 10:51:02 +09:00
Damien Elmes
b4f1d6622a use html parser on text export instead of fragile regex 2010-01-23 08:13:43 +09:00
Damien Elmes
28ff71a031 fix dingsbums tests 2010-01-23 06:42:02 +09:00
Damien Elmes
1ae05a8bc7 limit auto-detected delimiter to a known-good set 2010-01-23 06:00:06 +09:00
Damien Elmes
a6a7782030 fix another windows timer resolution bug 2010-01-22 02:16:57 +09:00
Damien Elmes
33aede4d56 document 'features' reuse, add tool to get var as string 2010-01-19 01:51:35 +09:00
Damien Elmes
bf35112bd0 improve latex error message 2010-01-12 04:38:44 +09:00
Damien Elmes
c7340edd6f strip html for text: fields 2010-01-08 22:02:16 +09:00
Damien Elmes
20da165b6e check backup integrity using existing db connection to avoid locking issues 2010-01-04 22:37:14 +09:00
Damien Elmes
33ec7ce133 clarify comment 2009-12-02 03:38:46 +09:00
Damien Elmes
ec9a7c3755 check db integrity on backup 2009-11-30 14:31:47 +09:00
Damien Elmes
6a8c19a889 use threadlocal for single user access 2009-11-30 08:34:31 +09:00
Damien Elmes
d44cbd5518 remove logging hack 2009-11-30 08:11:34 +09:00
Damien Elmes
e2f306ae3b fix cards/day amount 2009-11-29 19:47:53 +09:00
Damien Elmes
84b88507a2 tweak importing message 2009-11-27 19:53:24 +09:00
Damien Elmes
4bea904dc6 give the card id on cardAnswered hook, not old card 2009-11-27 15:59:58 +09:00
Damien Elmes
17630fa339 close text file after import 2009-11-27 15:27:01 +09:00
Damien Elmes
a50ec2649a fix undo of deck properties bug 2009-11-27 15:26:03 +09:00
Damien Elmes
093395b9e0 Revert "add 30 second timeout to all sync ops"
This reverts commit cbc23e5231.
2009-11-24 23:35:34 +09:00
Damien Elmes
feaedccc9a fix field ordinals on db check 2009-11-19 13:07:43 +09:00
Damien Elmes
c3833a6a10 quote loadfile cmd 2009-11-08 14:47:17 +09:00
Rick Gruber-Riemer
4971069856 Added importing for DingsBums?! decks 2009-11-08 14:39:09 +09:00
Damien Elmes
7e2fd90963 Merge git://github.com/jmazon/libanki 2009-10-31 15:50:56 +09:00
Jean-Baptiste Mazon
fe19dd806d rewrite field names as tags when importing with tagDuplicates 2009-10-31 00:35:46 +01:00
Damien Elmes
9671d15371 rewrite expression to be clearer 2009-10-25 19:48:28 +09:00
Damien Elmes
cbc23e5231 add 30 second timeout to all sync ops 2009-10-04 19:53:12 +09:00
Damien Elmes
164b0583c3 unlink tmp file after full up 2009-10-04 19:33:18 +09:00
Damien Elmes
4e83a67e00 lowercase is:foo searches 2009-10-04 19:30:21 +09:00
Damien Elmes
7d8904a65d factor spacing into due time 2009-10-01 20:17:31 +09:00
Damien Elmes
9f182b4d61 new stats 2009-10-01 17:44:43 +09:00
Damien Elmes
c786479268 timeout @ 60 2009-09-28 09:22:57 +09:00
Damien Elmes
1111cae80a mark everything updated on full db check 2009-09-26 23:13:28 +09:00
Damien Elmes
76376d9040 move the simple player code into a plugin 2009-09-26 23:05:30 +09:00
Damien Elmes
ebac830248 don't define MATPLOTLIBDATA on osx 2009-09-26 20:54:08 +09:00