mediagoblin.git
11 years agoChanging the information spat out while printing from media types->plugins
Christopher Allan Webber [Fri, 12 Jul 2013 19:16:47 +0000 (14:16 -0500)]
Changing the information spat out while printing from media types->plugins

Previously it called even plugins media types.  Ha!

This commit sponsored by Jon Merkley.  Thank you!

11 years agoadded a warning for old media types
Rodney Ewing [Tue, 2 Jul 2013 16:26:12 +0000 (09:26 -0700)]
added a warning for old media types

11 years agoconverted video media_type to plugin
Rodney Ewing [Tue, 2 Jul 2013 15:57:10 +0000 (08:57 -0700)]
converted video media_type to plugin

11 years agoconverted stl media_type to plugin
Rodney Ewing [Tue, 2 Jul 2013 15:52:33 +0000 (08:52 -0700)]
converted stl media_type to plugin

11 years agoconverted pdf media_type to plugin
Rodney Ewing [Tue, 2 Jul 2013 15:48:47 +0000 (08:48 -0700)]
converted pdf media_type to plugin

11 years agoconverted audio media_type to plugin
Rodney Ewing [Tue, 2 Jul 2013 15:43:14 +0000 (08:43 -0700)]
converted audio media_type to plugin

11 years agotypo in image supported_filetypes
Rodney Ewing [Tue, 2 Jul 2013 15:14:40 +0000 (08:14 -0700)]
typo in image supported_filetypes

11 years agoconverted ascii media_type to plugin
Rodney Ewing [Tue, 2 Jul 2013 15:09:37 +0000 (08:09 -0700)]
converted ascii media_type to plugin

11 years agofixed some typos and enabled media_type plugins in tests
Rodney Ewing [Tue, 2 Jul 2013 14:54:38 +0000 (07:54 -0700)]
fixed some typos and enabled media_type plugins in tests

11 years agoremoved sniff_handler from Imange Media Manager class
Rodney Ewing [Tue, 2 Jul 2013 14:20:20 +0000 (07:20 -0700)]
removed sniff_handler from Imange Media Manager class

11 years agoremoved CompatMediaManager() since all core media_types are classes
Rodney Ewing [Tue, 2 Jul 2013 00:23:47 +0000 (17:23 -0700)]
removed CompatMediaManager() since all core media_types are classes

11 years agomodified gmg to use plugin media_types and converted image media_type to new plugin...
Rodney Ewing [Tue, 2 Jul 2013 00:19:22 +0000 (17:19 -0700)]
modified gmg to use plugin media_types and converted image media_type to new plugin style

11 years agoMore clarifications on what ./bin/gmg dbupdate does on each run.
Christopher Allan Webber [Fri, 28 Jun 2013 16:51:40 +0000 (11:51 -0500)]
More clarifications on what ./bin/gmg dbupdate does on each run.

This commit sponsored by Jessica Howard.  Thanks, sistah!

11 years agoSome documentation on how to write database migrations.
Christopher Allan Webber [Fri, 28 Jun 2013 15:27:06 +0000 (10:27 -0500)]
Some documentation on how to write database migrations.

This commit sponsored by Andrei Cristian Petcu.  Thanks!

11 years agotypo
Rodney Ewing [Wed, 26 Jun 2013 14:39:17 +0000 (07:39 -0700)]
typo

11 years agodo the label thing only for boolean fields
Rodney Ewing [Wed, 26 Jun 2013 14:36:11 +0000 (07:36 -0700)]
do the label thing only for boolean fields

11 years agomade edit_account to autofocus on the first field
Rodney Ewing [Wed, 26 Jun 2013 13:45:36 +0000 (06:45 -0700)]
made edit_account to autofocus on the first field

11 years agoadded feature to render_divs where if field.label == '' then it will render form...
Rodney Ewing [Tue, 25 Jun 2013 22:50:31 +0000 (15:50 -0700)]
added feature to render_divs where if field.label == '' then it will render form.description the same a render_label

11 years agoExplain about sqlite dropping the constraint and why we're adding it back manually.
Christopher Allan Webber [Tue, 25 Jun 2013 22:12:33 +0000 (17:12 -0500)]
Explain about sqlite dropping the constraint and why we're adding it back manually.

11 years agocleanup after merge
Rodney Ewing [Tue, 25 Jun 2013 20:43:33 +0000 (13:43 -0700)]
cleanup after merge

11 years agoMerge remote-tracking branch 'upstream/master' into auth
Rodney Ewing [Tue, 25 Jun 2013 20:37:21 +0000 (13:37 -0700)]
Merge remote-tracking branch 'upstream/master' into auth

Conflicts:
mediagoblin/app.py
mediagoblin/auth/forms.py
mediagoblin/auth/tools.py
mediagoblin/db/migrations.py
mediagoblin/db/models.py
mediagoblin/edit/views.py
mediagoblin/plugins/basic_auth/tools.py
mediagoblin/tests/test_edit.py

11 years agotypo
Rodney Ewing [Tue, 25 Jun 2013 20:22:56 +0000 (13:22 -0700)]
typo

11 years agoAdd a bit more docs to plugin configuration
Christopher Allan Webber [Tue, 25 Jun 2013 18:25:25 +0000 (13:25 -0500)]
Add a bit more docs to plugin configuration

This commit sponsored by Michael Rauch.  Thank you!

11 years agoReverting "No more of this find_packages nonsense."
Christopher Allan Webber [Mon, 24 Jun 2013 14:10:48 +0000 (09:10 -0500)]
Reverting "No more of this find_packages nonsense."

This reverts commit b75eb88fabdac4a9fdc863969ec9472110732607.

11 years agoAdding a docstring to fixture_media_entry
Christopher Allan Webber [Sat, 22 Jun 2013 22:40:12 +0000 (17:40 -0500)]
Adding a docstring to fixture_media_entry

It's not complete, but it makes clearer how to avoid errors with
fake_upload :)

This commit sponsored by Harper Sanford.  Thank you!

11 years agoFix the data integrity bug in test_misc.
Christopher Allan Webber [Sat, 22 Jun 2013 22:37:30 +0000 (17:37 -0500)]
Fix the data integrity bug in test_misc.

It turns out this has to do with some additions to the fixture adding
of media entries.  Since the new fake_upload field is True by default,
adding multiple entries that have media_files at once meant that
multiple additions of FileKeynames would be added at once if they were
not saved at the same time.  Tricky!

Thankfully, Elrond helped us figure this one out.  Thanks, Elrond :)

And thanks also to Aapo Rantalainen for sponsoring this commit!

11 years agoPadding on the header-dropdown area
Christopher Allan Webber [Sat, 22 Jun 2013 21:19:58 +0000 (16:19 -0500)]
Padding on the header-dropdown area

This helps make it a bit clearer that things are "contained inside"
the header dropdown area.

11 years agoMerge remote-tracking branch 'refs/remotes/joar/notifications'
Christopher Allan Webber [Sat, 22 Jun 2013 21:13:41 +0000 (16:13 -0500)]
Merge remote-tracking branch 'refs/remotes/joar/notifications'

Conflicts:
mediagoblin/db/migrations.py

11 years agoFix by Rodney Ewing so render_http_exception works with newer Werkzeug versions.
Christopher Allan Webber [Sat, 22 Jun 2013 17:25:31 +0000 (12:25 -0500)]
Fix by Rodney Ewing so render_http_exception works with newer Werkzeug versions.

11 years agoRemoving the "enter your password to change your email" bit.
Christopher Allan Webber [Fri, 21 Jun 2013 22:24:33 +0000 (17:24 -0500)]
Removing the "enter your password to change your email" bit.

A good idea, though it feels fairly clumsy in the form, and I think if
you're logged in you can already sabotage the user pretty well.

This commit sponsored by Sergey Matveev.  Thanks!

11 years agochanges after cwebb's review
Rodney Ewing [Fri, 21 Jun 2013 21:14:40 +0000 (14:14 -0700)]
changes after cwebb's review

11 years agoMerge remote-tracking branch 'refs/remotes/rodney757-github/mail'
Christopher Allan Webber [Fri, 21 Jun 2013 20:50:36 +0000 (15:50 -0500)]
Merge remote-tracking branch 'refs/remotes/rodney757-github/mail'

11 years agoIndenting some stuff in pdf.html and wrapping width and height parameters in quotes
Christopher Allan Webber [Thu, 20 Jun 2013 23:14:14 +0000 (18:14 -0500)]
Indenting some stuff in pdf.html and wrapping width and height parameters in quotes

11 years agopdf: remove two unused files (we use pdf.js in an iframe, no need for our own bastard...
Alon Levy [Thu, 20 Jun 2013 22:51:47 +0000 (01:51 +0300)]
pdf: remove two unused files (we use pdf.js in an iframe, no need for our own bastard copy)

Signed-off-by: Alon Levy <alevy@redhat.com>
11 years agoWhat is models_v0.py? An explaination!
Christopher Allan Webber [Thu, 20 Jun 2013 17:08:20 +0000 (12:08 -0500)]
What is models_v0.py?  An explaination!

This commit sponsored by Alex Hannan-Joyner.  Thanks!

11 years agoNow in dev mode on 0.4.1
Christopher Allan Webber [Tue, 18 Jun 2013 03:50:31 +0000 (22:50 -0500)]
Now in dev mode on 0.4.1

11 years agoMediaGoblin v0.4.0!
Christopher Allan Webber [Mon, 17 Jun 2013 01:32:28 +0000 (20:32 -0500)]
MediaGoblin v0.4.0!

11 years agoCommitting extracted and compiled translations
Christopher Allan Webber [Mon, 17 Jun 2013 01:06:48 +0000 (20:06 -0500)]
Committing extracted and compiled translations

11 years agoCommitting present MediaGoblin translations before pushing extracted messages
Christopher Allan Webber [Mon, 17 Jun 2013 01:06:32 +0000 (20:06 -0500)]
Committing present MediaGoblin translations before pushing extracted messages

11 years agoDocumenting most of the the many new features in the release notes.
Christopher Allan Webber [Mon, 17 Jun 2013 00:39:03 +0000 (19:39 -0500)]
Documenting most of the the many new features in the release notes.

11 years agoAdded Laura Arjona to AUTHORS.
Christopher Allan Webber [Sat, 15 Jun 2013 23:49:32 +0000 (18:49 -0500)]
Added Laura Arjona to AUTHORS.

I'm not sure what all translators are there, but for sure Laura has
done a lot ;)

11 years agomoved authentication_disabled to config_spec
Rodney Ewing [Sat, 15 Jun 2013 19:32:20 +0000 (12:32 -0700)]
moved authentication_disabled to config_spec

11 years agoAdding new contributors to this release
Christopher Allan Webber [Sat, 15 Jun 2013 16:44:00 +0000 (11:44 -0500)]
Adding new contributors to this release

11 years agomedia-types.rst: clarify the pdf media type requirements
Alon Levy [Thu, 13 Jun 2013 02:42:58 +0000 (22:42 -0400)]
media-types.rst: clarify the pdf media type requirements

Explain that it works fine without libreoffice, just with reduced
functionality.

Signed-off-by: Alon Levy <alevy@redhat.com>
11 years agochanged no_auth to authentication_disabled in config
Rodney Ewing [Tue, 11 Jun 2013 21:30:38 +0000 (14:30 -0700)]
changed no_auth to authentication_disabled in config

11 years agoNew notifications, fixed
Joar Wandborg [Sun, 9 Jun 2013 20:23:20 +0000 (22:23 +0200)]
New notifications, fixed

- Remove notification-gem if notifications are null
- Move comment-susbscription next to add-comment button
- Add copyright header to notifications.js

11 years agoNew notifications
Joar Wandborg [Sun, 7 Apr 2013 21:17:23 +0000 (23:17 +0200)]
New notifications

- Added request.notifications
- Email configuration fixes
  - Set config_spec default SMTP port to `0` and switch to SSL/non-SSL
    default if `port == 0`
  - Added email_smtp_use_ssl configuration setting
- Added migrations for notification tables
- Added __repr__ to MediaComment(Mixin)
- Added MediaComment.get_entry => MediaEntry
- Added CommentSubscription, CommentNotification, Notification,
  ProcessingNotification tables
- Added notifications.task to celery init
- Fixed a bug in the video transcoder where pygst would hijack the
  --help argument.
- Added notifications
  - views
    - silence
    - subscribe
  - routes
  - utility methods
  - celery task
- Added half-hearted .active comment CSS style
- Added quick JS to show header_dropdown
- Added fragment template to show notifications in header_dropdown
- Added fragment template to show subscribe/unsubscribe buttons on
  media/comment pages
- Updated celery setup tests with notifications.task
- Tried to fix test_misc tests that I broke
- Added notification tests
- Added and extended tests.tools fixtures
- Integrated new notifications into media_home, media_post_comment views
- Bumped SQLAlchemy dependency to >= 0.8.0 since we need polymorphic for
  the notifications to work

11 years agoAdded some test-writing docs for plugins, but not sure if they're good. ;)
Christopher Allan Webber [Fri, 7 Jun 2013 16:45:07 +0000 (11:45 -0500)]
Added some test-writing docs for plugins, but not sure if they're good. ;)

This commit sponsored by Joe Lee.  Thank you!

11 years ago./bin/gmg dbupdate, not ./bin/dbupdate
Christopher Allan Webber [Thu, 6 Jun 2013 22:56:00 +0000 (17:56 -0500)]
./bin/gmg dbupdate, not ./bin/dbupdate

Thanks to Tsyesica for catching this :)

11 years agoCloudFiles: Default to SSL URIs
Joar Wandborg [Thu, 6 Jun 2013 22:28:17 +0000 (00:28 +0200)]
CloudFiles: Default to SSL URIs

11 years agocleanup
Rodney Ewing [Tue, 4 Jun 2013 23:50:06 +0000 (16:50 -0700)]
cleanup

11 years agofixed a bug that was deleting the messages
Rodney Ewing [Tue, 4 Jun 2013 18:26:34 +0000 (11:26 -0700)]
fixed a bug that was deleting the messages

11 years agominor changes from aaronw's review
Rodney Ewing [Tue, 4 Jun 2013 14:58:17 +0000 (07:58 -0700)]
minor changes from aaronw's review

11 years agoMerge remote-tracking branch 'upstream/master' into basic_auth
Rodney Ewing [Mon, 3 Jun 2013 23:20:19 +0000 (16:20 -0700)]
Merge remote-tracking branch 'upstream/master' into basic_auth

11 years agoMake sure that the pytest revision is at least at 2.3.
Christopher Allan Webber [Mon, 3 Jun 2013 18:29:04 +0000 (13:29 -0500)]
Make sure that the pytest revision is at least at 2.3.

11 years agoMerge remote-tracking branch 'upstream/master' into basic_auth
Rodney Ewing [Thu, 30 May 2013 23:31:15 +0000 (16:31 -0700)]
Merge remote-tracking branch 'upstream/master' into basic_auth

11 years agoCommenting out the max-height restriction on thumbnails.
Christopher Allan Webber [Thu, 30 May 2013 15:23:50 +0000 (10:23 -0500)]
Commenting out the max-height restriction on thumbnails.

11 years agoExplained more clearly why it's okay for interface classes to be keys.
Christopher Allan Webber [Wed, 29 May 2013 23:10:09 +0000 (18:10 -0500)]
Explained more clearly why it's okay for interface classes to be keys.

This commit sponsored by Nick Glynn.  Thank you!

11 years agoProvide a tip on how to do interfaces via our plugin API.
Christopher Allan Webber [Wed, 29 May 2013 22:21:15 +0000 (17:21 -0500)]
Provide a tip on how to do interfaces via our plugin API.

Uses a frogputer science approach to frobbing as an example (which is
total nonsense, but fun).

This commit sponsored by Ryan Kelln.  Thank you!

11 years agoActually use the right underlining for the wtforms hooks section
Christopher Allan Webber [Wed, 29 May 2013 21:12:24 +0000 (16:12 -0500)]
Actually use the right underlining for the wtforms hooks section

11 years agoAdditional hook tips! Documentation on how to modify a wtforms form.
Christopher Allan Webber [Wed, 29 May 2013 20:57:58 +0000 (15:57 -0500)]
Additional hook tips!  Documentation on how to modify a wtforms form.

This commit sponsored by Gian-Maria Daffré.  Thank you!

11 years agoWhere do you find hooks? How do you add them? An explaination!
Christopher Allan Webber [Wed, 29 May 2013 20:35:37 +0000 (15:35 -0500)]
Where do you find hooks?  How do you add them?  An explaination!

This commit about talking to community members sponsored by
community member Aeva Palecek.  Thanks!

11 years agocleanup after merge
Rodney Ewing [Tue, 28 May 2013 17:43:57 +0000 (10:43 -0700)]
cleanup after merge

11 years agomodified verification emails to use itsdangerous tokens
Rodney Ewing [Wed, 22 May 2013 21:51:30 +0000 (14:51 -0700)]
modified verification emails to use itsdangerous tokens

11 years agosend_verification_email was moved to auth/tools
Rodney Ewing [Wed, 29 May 2013 20:19:36 +0000 (13:19 -0700)]
send_verification_email was moved to auth/tools

11 years agoform is already validated, no need to validate again
Rodney Ewing [Wed, 29 May 2013 20:13:50 +0000 (13:13 -0700)]
form is already validated, no need to validate again

11 years agoActually link to the release notes when we say "see the release notes".
Christopher Allan Webber [Wed, 29 May 2013 19:13:12 +0000 (14:13 -0500)]
Actually link to the release notes when we say "see the release notes".

This commit sponsored by Brian Kemp.  Thank you!

11 years agoLink to the plugin api stuff and the database plugin sections from the quickstart.
Christopher Allan Webber [Wed, 29 May 2013 19:10:07 +0000 (14:10 -0500)]
Link to the plugin api stuff and the database plugin sections from the quickstart.

This commit sponsored by Nathan Stephenson.  Thank you!

11 years agoThe pdf.js iframe view is awesome so I'm making it the default. So there! ;)
Christopher Allan Webber [Tue, 28 May 2013 21:36:27 +0000 (16:36 -0500)]
The pdf.js iframe view is awesome so I'm making it the default.  So there! ;)

This commit sponsored by Jay Turley.  Thank you!

11 years agoFixing bug where non-image types might break if app_config['original_date_visible...
Christopher Allan Webber [Tue, 28 May 2013 21:34:47 +0000 (16:34 -0500)]
Fixing bug where non-image types might break if app_config['original_date_visible'] is true

Not all media managers have the .get_original_date attribute, so of
course break.  This is fixed by making a new space where individual
media types can define this if they like.

This commit sponsored by Matthieu Dupont de Dinechin.  Thank you!

11 years agoMerge remote-tracking branch 'upstream/master' into change_email
Rodney Ewing [Tue, 28 May 2013 17:46:46 +0000 (10:46 -0700)]
Merge remote-tracking branch 'upstream/master' into change_email

Conflicts:
mediagoblin/auth/lib.py

11 years agoremoved extra argument from check_login_simple in login view
Rodney Ewing [Tue, 28 May 2013 16:56:16 +0000 (09:56 -0700)]
removed extra argument from check_login_simple in login view

11 years agocleanup
Rodney Ewing [Tue, 28 May 2013 16:28:59 +0000 (09:28 -0700)]
cleanup

11 years agoMerge remote-tracking branch 'upstream/master' into basic_auth
Rodney Ewing [Tue, 28 May 2013 16:20:35 +0000 (09:20 -0700)]
Merge remote-tracking branch 'upstream/master' into basic_auth

Conflicts:
mediagoblin/auth/tools.py
mediagoblin/auth/views.py
mediagoblin/plugins/basic_auth/tools.py

11 years agocleanup
Rodney Ewing [Tue, 28 May 2013 16:05:05 +0000 (09:05 -0700)]
cleanup

11 years agoConflicts:
Rodney Ewing [Tue, 28 May 2013 02:34:49 +0000 (19:34 -0700)]
Conflicts:
mediagoblin/auth/tools.py
mediagoblin/auth/views.py
mediagoblin/plugins/basic_auth/tools.py

11 years agoadded a register_user function
Rodney Ewing [Fri, 24 May 2013 19:52:14 +0000 (12:52 -0700)]
added a register_user function

cherry picked from rodney757 and fixed for out of order
picking.

11 years agocreated a check_login_simple function
Rodney Ewing [Sat, 25 May 2013 14:59:03 +0000 (07:59 -0700)]
created a check_login_simple function

cherry-picked from rodney757, fixed few conflicts due to
out of order cherry-picking. Thanks to rodney757 for making
my idea even better.

11 years agomoved email_debug_message to gmg/tools/mail
Rodney Ewing [Fri, 24 May 2013 19:48:29 +0000 (12:48 -0700)]
moved email_debug_message to gmg/tools/mail

11 years agomoved send_verification_email to auth/tools
Rodney Ewing [Fri, 24 May 2013 19:26:45 +0000 (12:26 -0700)]
moved send_verification_email to auth/tools

11 years agoremoved unused import
Rodney Ewing [Thu, 23 May 2013 21:56:32 +0000 (14:56 -0700)]
removed unused import

11 years agoCommitting extracted and compiled translations
Christopher Allan Webber [Mon, 27 May 2013 18:55:06 +0000 (13:55 -0500)]
Committing extracted and compiled translations

11 years agomodified get_user function to take kwargs instead of username
Rodney Ewing [Mon, 27 May 2013 18:13:23 +0000 (11:13 -0700)]
modified get_user function to take kwargs instead of username

11 years agono need for user might be email kwarg in check_login_simple
Rodney Ewing [Mon, 27 May 2013 17:38:09 +0000 (10:38 -0700)]
no need for user might be email kwarg in check_login_simple

11 years agoMerge branch 'pre-auth' into basic_auth
Rodney Ewing [Mon, 27 May 2013 16:04:53 +0000 (09:04 -0700)]
Merge branch 'pre-auth' into basic_auth

Conflicts:
mediagoblin/auth/tools.py
mediagoblin/auth/views.py
mediagoblin/plugins/basic_auth/tools.py

11 years agomoved fp_verification_email to auth/tools
Rodney Ewing [Mon, 27 May 2013 15:57:56 +0000 (08:57 -0700)]
moved fp_verification_email to auth/tools

11 years agocreated a check_login_simple function
Rodney Ewing [Sat, 25 May 2013 14:59:03 +0000 (07:59 -0700)]
created a check_login_simple function

11 years agoadded a register_user function
Rodney Ewing [Fri, 24 May 2013 19:52:14 +0000 (12:52 -0700)]
added a register_user function

11 years agomoved email_debug_message to gmg/tools/mail
Rodney Ewing [Fri, 24 May 2013 19:48:29 +0000 (12:48 -0700)]
moved email_debug_message to gmg/tools/mail

11 years agomoved send_verification_email to auth/tools
Rodney Ewing [Fri, 24 May 2013 19:26:45 +0000 (12:26 -0700)]
moved send_verification_email to auth/tools

11 years agoremoved unused import
Rodney Ewing [Thu, 23 May 2013 21:56:32 +0000 (14:56 -0700)]
removed unused import

11 years agochanged User model pw_hash field to nullable and added migrations
Rodney Ewing [Thu, 23 May 2013 21:33:56 +0000 (14:33 -0700)]
changed User model pw_hash field to nullable and added migrations

11 years agono need for check_login with the new check_login_simple function
Rodney Ewing [Mon, 27 May 2013 15:54:25 +0000 (08:54 -0700)]
no need for check_login with the new check_login_simple function

11 years agorenamed lib to tools
Rodney Ewing [Mon, 27 May 2013 15:43:12 +0000 (08:43 -0700)]
renamed lib to tools

11 years agocleanup after merge
Rodney Ewing [Mon, 27 May 2013 15:39:34 +0000 (08:39 -0700)]
cleanup after merge

11 years agoMerge branch 'pre-auth' into basic_auth
Rodney Ewing [Mon, 27 May 2013 15:25:22 +0000 (08:25 -0700)]
Merge branch 'pre-auth' into basic_auth

Conflicts:
mediagoblin/auth/tools.py
mediagoblin/auth/views.py
mediagoblin/db/migrations.py
mediagoblin/plugins/basic_auth/lib.py
mediagoblin/plugins/httpapiauth/__init__.py
mediagoblin/plugins/piwigo/views.py

11 years agoExtract footer into bits/base_footer.html.
Elrond [Sun, 26 May 2013 11:29:02 +0000 (13:29 +0200)]
Extract footer into bits/base_footer.html.

11 years agocreated a check_login_simple function
Rodney Ewing [Sat, 25 May 2013 14:59:03 +0000 (07:59 -0700)]
created a check_login_simple function

11 years agoadded a register_user function
Rodney Ewing [Fri, 24 May 2013 19:52:14 +0000 (12:52 -0700)]
added a register_user function

11 years agomoved email_debug_message to gmg/tools/mail
Rodney Ewing [Fri, 24 May 2013 19:48:29 +0000 (12:48 -0700)]
moved email_debug_message to gmg/tools/mail