- modify controller.Users.current() to return the user's groups
- update test_current() unit tests to expect empty groups list in results
- modify Main_page, Notebook_rss, Front_page, Tour_page, and Upgrade_page to accept a new groups parameter
- Main_page should add it as a hidden HTML variable
- update Wiki.js to read the hidden groups variable and display the groups in account settings
anonymous user), open a search result from a notebook. Then, login and try to
edit that notebook as a user with read-write privileges. it will show up as
read-only, presumably because it's being read from the cache.
- make model.Notebook.sql_search_notes() search either with user_id or an anonymous user_id, not both
- update controller.Notebooks.search(), so if the anonymous user has access to the given notebook,
then run the search as the anonymous user instead of the given user id
- update unit tests
- don't search trash/deleted notebooks
- change model.Notebook.sql_search_notes() to be a static method
- take a first_notebook_id argument and a user_id argument
- join user_notebook on notebook_id and matches on user_notebook.user_id instead of notebook_id
- order by notebook_id = first_notebook desc, rank instead of just rank
- include search result for notebooks readable by anonymous user, but only if such a notebook is given as first_notebook_id
- update code that calls model.Notebook.sql_search_notes()
- update model.Note.to_dict() to include notebook_id
- modify Wiki.display_search_results()
- separate search results for the current notebook and results for all other notebooks
- indicate which notebook each result is from
- if there are results in other notebooks but no results in the current notebook, indicate that clearly
- when you click on a result note link in the current notebook, it should simply open a new note
- when you click on a result note link in another notebook, it should open in a new window
- test in IE
- update unit tests for:
- controller.Notebooks.search()
- model.Notebook.sql_search_notes()
- model.Note.to_dict()
name would cause a UnicodeEncodeError upon sending the invite email. Now
such invites are encoded as quoted-printable UTF-8, while other invites
continue to be 7-bit ASCII.
* Added new optional previous_revision params to default(), contents() and load_note() in controller.Notebooks.
These use Html_differ() to generate and return diffs.
* Updated Wiki.js:
* provide previous_revision when a revision is opened in a new window/tab
* call load_note() when two revisions when a revision is clicked in Changes_pulldown
* update compare_versions() to display a diff instead of opening the two revisions separately
* update load_editor():
* update all invocations of load_editor(), including in Editor.js, to accept a new previous_revision argument
* modify load_editor() to use the previous_revision argument (when supplied) to load a diff
* If a phrase becomes italicized, it should show the non-italic version in red and immediately after, the italic
version in green.
This required doing a pass on the HTML to merge certain elements together before doing the actual diff.
strings. Not perfect yet. For instance, if string a contains "foo bar baz" and
string b contains "foo <i>bar</i> baz", the resulting output does not show
"bar" in strikeout and "<i>bar</i>" in green, as one might expect.
* Implemented new controller.Notebooks.load_recent_updates() method.
* Added new Wiki.js total_notes_count_updated signal
* Added "more" and "less" links to "recent updates" table.
* Updated Wiki.js Recent_notes to support new "more" and "less" links.
* Commented out unfinished discussion forums unit test.
* controller.Notebooks now takes (and stores) an https_url constructor parameter.
* New controller.Notebooks.updates() method to produce an updates RSS feed for a particular notebook.
* New controller.Notebooks.get_update_link() method to make a brief page with just a link for an updated note, referred to by the feed.
* Implemented views for the new RSS feed.
* Fixed bug in Rss_item's guid that caused newlines to be inserted before and after long URLs.
* Still need to unit test new controller code.
that note's entries in the note tree. When a note with no children is updated
so that it has at least one child, add an expander to that note's entries in
the note tree.
* Added a bunch of thumbnail-related methods to controller.Files.
* Modified Files.download() method to redirect to image preview if
requested.
* Implemented image preview to popup full image in a separate window.
* Added empty stubs for relevant unit tests. Still to-do.
* Added new dependency on python-imaging package (PIL).
* Updated file info popup to include clickable thumbnail.
regardless of commit flag. Without this, the file upload progress bar breaks
because it gets a stale File object out of the cache.
Eventually, it would be better if cache sets were only done condittionally
based on commit flag, and also whenever Database.commit() is called.
"/users/logout" URL will log you out and redirect you the front page.
Made front page prettier and better at explaining Luminotes (hopefully). The
front page is no longer a wiki, but is instead a mostly static page.
title when uploading a file, as this plays more nicely with IE. With
replaceChildNodes(), IE swallows the text cursor and won't give it back.
Also explicitly passing link parameter to Upload_pulldown() constructor, as
editor.find_link_at_cursor() wasn't always working in IE.
1. In progress(), around the time when the file starts uploading. This causes
an upload that's too large to bail before the whole file uploads, but the
quota calculation is only an estimate and relies on the client actually
calling progress().
2. In upload(), when the file finishes uploading. This quota calculation is
exact, but only happens after the entire upload completes.
* controller.Files.upload() now updates user quota storage.
* When a file is uploaded, the new storage bytes count is returned to the client and displayed.
* new toolbar button for attaching a file
* button opens new Upload_pulldown() for uploading a file
* began controller.Notebooks.upload_file() to process the upload
then a new read-write notebook is created for you automatically. This fixes a
bug where you could delete a notebook and have only a read-only notebook
remaining, thereby having no way to add a new notebook.
stupidity proved too complex and fragile. So now they have the full power to
shoot themselves in the foot.
A user can no longer, however, redeem an invite that they send to themself.
* change controller.Notebooks.load_note_revisions() to select and return User_revision objects
* change controller.Notebooks.save_note() to use User_revision objects for new_revision and previous_revision as well
* update client to deal with new load_note_revisions() return values (make sure all uses of revisions_list are updated)
* update client to deal with new new_revision/previous_revision
* update changes pulldown to show username along with each timestamp
* update model.Invite to load redeemed_username along with redeemed_user_id
* display the redeemed username next to each email address in the "share this notebook" note
* Modified Wiki.js to include invite_id parameter when necessary.
* Increased storage quota (and price) for premium rate plan.
* Added a note displayed when redeeming an invite, with links to signup and login.
* Fixed Invite.sql_update() to have SQL params in proper order.
* Fixed bug where email addresses containing "-" were considered invalid.
* Made UI for inviting other people to your notebook.
* Tweaked the rate plans and added a new one.
revision of a note that's not in the trash. This is because that particular
revision of the note represents when the note used to be in the trash (because
it was previously deleted).
on the link. Delete the new note. Then go back to the first message, and click
after the link, so the link's pulldown shows. You'll get this error message:
"Sorry, you don't have access to do that."
The fix was to look for the cases when the deleted note is either in the trash
or deleted "forever", and then return None for the note value (instead of just
raising an Access_error).
the client. Previously, the main page would load as mostly blank, then the
client would immediately issue two async json calls to load the user and
notebook data, including startup notes. Now, the main page loads with the note
data actually as part of the page. If JavaScript is off, then you see all the
notes displayed, including startup notes and any designated note. If
JavaScript is on, then those "static" notes are instantly hidden and their
contents are loaded into iframes for editing/display.
The real upshot is that Luminotes in read-only mode is now more useful when
JavaScript is off, and actually displays notes and their contents. This is
very useful for search engine indexing.
Updated all Python unit tests. Still have to get to JavaScript unit tests,
what few their are.
svn+ssh://torsion.org/home/luminotes/repos/luminotes/branches/postgres
................
r402 | witten | 2007-10-04 00:48:49 -0700 (Thu, 04 Oct 2007) | 3 lines
Initialized merge tracking via "svnmerge" with revisions "1-401" from
svn+ssh://torsion.org/home/luminotes/repos/luminotes/trunk
................
r404 | witten | 2007-10-04 01:17:07 -0700 (Thu, 04 Oct 2007) | 2 lines
Beginning a conversion from bsddb to postgres.
................
r405 | witten | 2007-10-04 01:18:58 -0700 (Thu, 04 Oct 2007) | 9 lines
Merged revisions 402-404 via svnmerge from
svn+ssh://torsion.org/home/luminotes/repos/luminotes/trunk
........
r403 | witten | 2007-10-04 01:14:45 -0700 (Thu, 04 Oct 2007) | 2 lines
Yay, no more stupid deprecation warnings from simplejson about the sre module.
........
................
r406 | witten | 2007-10-04 15:34:39 -0700 (Thu, 04 Oct 2007) | 4 lines
* Switched back to Python 2.4 because many Python modules in Debian are not packaged to work with Python 2.5
* Began removal of all references to Scheduler, @async, yield, and so on.
* Converted Database.py to support PostgreSQL and updated its unit tests accordingly.
................
r407 | witten | 2007-10-04 16:34:01 -0700 (Thu, 04 Oct 2007) | 2 lines
All unit tests for the new model classes now pass.
................
r409 | witten | 2007-10-05 00:53:56 -0700 (Fri, 05 Oct 2007) | 2 lines
Reordering some columns and adding some indices.
................
r410 | witten | 2007-10-05 16:08:37 -0700 (Fri, 05 Oct 2007) | 4 lines
Now adding trash notebooks to user_notebook table. Also switching db
conversion/verification tools back to require Python 2.5, since they still use
the old Scheduler, which requires 2.5 generator features.
................
r411 | witten | 2007-10-06 16:26:56 -0700 (Sat, 06 Oct 2007) | 2 lines
Lots more unit tests passing. Most of the recent work was on controller.Users and related stuff.
................
r412 | witten | 2007-10-07 01:52:12 -0700 (Sun, 07 Oct 2007) | 2 lines
controller.Users unit tests now finally pass!
................
r413 | witten | 2007-10-07 02:14:10 -0700 (Sun, 07 Oct 2007) | 3 lines
Got controller.Root unit tests passing.
Moved fake sql_* function shenanigans from Test_users.py to Test_controller.py, for use by other controller unit tests.
................
r414 | witten | 2007-10-08 23:11:11 -0700 (Mon, 08 Oct 2007) | 2 lines
All unit tests pass! Fuck yeah!
................
r415 | witten | 2007-10-08 23:13:07 -0700 (Mon, 08 Oct 2007) | 2 lines
Removing all references to Scheduler from luminotes.py
................
r416 | witten | 2007-10-08 23:54:51 -0700 (Mon, 08 Oct 2007) | 3 lines
Converted deleted_from to deleted_from_id in a few more places.
Fixed bug in Users.contents().
................
r417 | witten | 2007-10-09 00:11:59 -0700 (Tue, 09 Oct 2007) | 3 lines
Typo fix in Note sql method.
Adding autocommit flag to Database.next_id() method.
................
r418 | witten | 2007-10-09 00:13:19 -0700 (Tue, 09 Oct 2007) | 2 lines
Updating unit test for new auto commit flag.
................
r419 | witten | 2007-10-09 00:14:09 -0700 (Tue, 09 Oct 2007) | 2 lines
Removing debugging print.
................
r420 | witten | 2007-10-09 00:20:55 -0700 (Tue, 09 Oct 2007) | 2 lines
More sql fixes. I really need some funtional tests that hit the database and exercise the SQL.
................
r421 | witten | 2007-10-09 00:51:34 -0700 (Tue, 09 Oct 2007) | 3 lines
Fixed controller.Database handling of tuple as an Object_type.
Made SQL for user storage calculation better at handling null values and also more succinct.
................
r422 | witten | 2007-10-09 13:32:16 -0700 (Tue, 09 Oct 2007) | 2 lines
Converting Wiki.js to trash_id notebook member instead of trash object.
................
r423 | witten | 2007-10-09 13:42:10 -0700 (Tue, 09 Oct 2007) | 2 lines
No longer displaying "download as html" on the front page, as people see "download" and think they're downloading the software.
................
r424 | witten | 2007-10-09 14:24:40 -0700 (Tue, 09 Oct 2007) | 2 lines
Notebooks.contents() now returns notebooks with correct read-write status.
................
r425 | witten | 2007-10-09 14:32:25 -0700 (Tue, 09 Oct 2007) | 2 lines
Fixed reporting of validation errors to the user. Now says "The blah is missing." instead of just "is missing"
................
r426 | witten | 2007-10-09 17:05:22 -0700 (Tue, 09 Oct 2007) | 2 lines
No longer redirecting to trash notebook upon login.
................
r427 | witten | 2007-10-09 17:20:33 -0700 (Tue, 09 Oct 2007) | 2 lines
Made controller.Database use a connection pool.
................
r429 | witten | 2007-10-09 20:13:30 -0700 (Tue, 09 Oct 2007) | 2 lines
Converted initdb.py and updatedb.py to Postgres from bsddb.
................
r430 | witten | 2007-10-09 20:37:14 -0700 (Tue, 09 Oct 2007) | 2 lines
Changing error message to remove underscores from variable names.
................
r431 | witten | 2007-10-10 13:23:30 -0700 (Wed, 10 Oct 2007) | 2 lines
Removing unused note_title parameter from Wiki.create_editor().
................
r432 | witten | 2007-10-10 13:25:16 -0700 (Wed, 10 Oct 2007) | 2 lines
Revision regular expression now supports timezone notation.
................
r433 | witten | 2007-10-10 14:43:47 -0700 (Wed, 10 Oct 2007) | 2 lines
Finished implementing ranked ordering for startup notes. (However, there's no way to change the rank from the client yet.)
................
r434 | witten | 2007-10-10 16:25:19 -0700 (Wed, 10 Oct 2007) | 4 lines
More strict access checking. Fixed oversight in Postgres DB conversion where,
in certain controller.Notebook methods, access was only checked at the
notebook level, not at the note level as well.
................
r435 | witten | 2007-10-10 17:45:18 -0700 (Wed, 10 Oct 2007) | 3 lines
Now loading revisions on demand from client when the "changes" button is clicked. Also caching
loading revisions so subsequent clicks don't have to reload.
................
r436 | witten | 2007-10-10 21:31:20 -0700 (Wed, 10 Oct 2007) | 2 lines
Tweaking some of the error handling in Expose and Root so that unhandled errors give a generic error message to the client.
................
r437 | witten | 2007-10-10 21:33:49 -0700 (Wed, 10 Oct 2007) | 2 lines
The release script no longer runs initdb.py, because the default database is no longer a single file included in the tarball.
................
r438 | witten | 2007-10-10 21:40:11 -0700 (Wed, 10 Oct 2007) | 2 lines
Updated install instructuctions to include use of initdb.py.
................
r439 | witten | 2007-10-10 21:56:42 -0700 (Wed, 10 Oct 2007) | 3 lines
Made initdb.py only nuke (drop tables/views) when given a command-line flag.
Also made install directions more correct.
................
r440 | witten | 2007-10-10 21:58:48 -0700 (Wed, 10 Oct 2007) | 2 lines
IE 6 doesn't like commas.
................
r441 | witten | 2007-10-10 22:08:50 -0700 (Wed, 10 Oct 2007) | 4 lines
load your notebook. without clicking on "changes", edit a note that has previous revisions. click on "changes". it'll only show
the most recent revision. fixed by not appending to changes as a result of a save unless the client-side revisions list cache has
something in it
................
r442 | witten | 2007-10-10 23:30:41 -0700 (Wed, 10 Oct 2007) | 2 lines
Forgot to actually save off the new revision as editor.revision.
................
r443 | witten | 2007-10-11 01:35:54 -0700 (Thu, 11 Oct 2007) | 13 lines
More intelligent datetime handling:
* convertdb.py assumes old bsddb database timestamps are Pacific, and then
converts them to UTC before inserting them into the new PostgreSQL
database.
* No longer using naked timezoneless datetime objects in model/controller
code, except in unit tests that need compatability with pysqlite. Now
using UTC everwhere.
* Asking PostgreSQL to give us all timestamps back in UTC.
* New dependency on python-tz (pytz) package, noted in INSTALL doc.
* Client now responsible for converting UTC timestamps to local time for
display.
................
r444 | witten | 2007-10-11 01:46:09 -0700 (Thu, 11 Oct 2007) | 2 lines
Tweak to prevent potential race in IE.
................
r445 | witten | 2007-10-11 01:49:58 -0700 (Thu, 11 Oct 2007) | 2 lines
Got JavaScript "unit" tests passing again.
................
r446 | witten | 2007-10-11 01:53:58 -0700 (Thu, 11 Oct 2007) | 2 lines
Noting that js tests require the Luminotes server on localhost.
................
Wrote a tool to verify that convertdb.py does what it's supposed to.
Added a todo comment to Scheduler about threading and generators.
Updated INSTALL documentation about eventual Postgres requirement.