That apps that power Mingus 0.9
Extending my previous post The apps that power Django-Mingus, the best way to discuss what has changed in Mingus is to discuss the new apps.
Well, wait just one second
Ok, maybe the best way to begin is to quickly discuss a few higher level updates. The first, and one I'm very proud of, is that Mingus was recently added to Transifix and now has both Spanish and French translations included thus far. To be honest, Transifix wasn't the reason these two languages were added (two developers contributed them before Transifix came into the picture), but I can see it helping in getting the rest. Getting Mingus translated probably wouldn't have been possible if:
- I didn't focus on providing at least the basic pipeline for internationalization (templates, admin/models where possible)
- And if Pablo Marti and Florent Messa didn't come in and clean up where I left off. Thanks to those two Mingus now has Spanish and French translations.
The fact is that so many apps (and I'm to blame here for some of my apps in the past as well) just don't do the basic i18n legwork that gets your app 80-90% of the way there. It's so easy, so go read up on Django Internationalization now before you forget. I won't produce an open source Django app without doing so ever again.
Probably the best thing to come out of Mingus 0.9 is the community that helped get it there. Developers (handles) like acdha, richleland, hotsyk, danfairs, mikl, scelis, pmarti and thoas, as well as skevy, and jefftriplett, and the others helped make Mingus a better product by forking it on their own, adding features, forking a reusable app it uses and updating those, etc. Speaking of those other reusable apps, of course we can't forget to thank all the authors of those reusable apps as well. And finally, github made following commits, forks, branches, and merging updates a cake.
Other than that there were a slew of changes, but nothing too horrible if you're looking to upgrade on your own. A few apps we'll discuss soon have been added, the location/handling of static media in the project has been updated -- I discuss that below when reviewing Django-StaticFile. I've begun maintaing a
docs/CHANGELOG file for these types of details, something I should have done since day one -- lesson learned. You can always reference the project's git commit log for the finer details. For anyone looking to migrate from an already existing, older version of Mingus there are three key changes to note:
- Two new columns have been added to
basic.blog.models.Settingsand Mingus provides postgres SQL migrations for these (no South yet, sorry)
- Permalinks have been updated to be more international friendly (previously the month was a character sequence and now is a digit sequence). The detail view has logic to support legacy urls with raising a 404 but your Disqus comments won't be smart enough to know the difference between the new and the old URL (disqus uses the URL as a key look for your comments). So if your comments disappear on you then you know why. A solution to fix this is to write a Disqus migration, or fork the basic-apps code Mingus uses and revert back to the older pattern, or update the templates where they populate the url, or do like I did and add a "My url scheme changed, if you'd like to see older comments click here" type solution. Not pretty, but works for me. So you have a few options available to you.
- Static media directory move mentioned above, but you may have customized that anyway.
For those coders out there looking to syntax highlight your code well Django-Markup pygmentizes your text by default (not knowing that though I had previously added a pygmentize filter to the templates but that has been removed to reduce redundancy). If you're using the Django-Markup editors (markdown or reStructuredTex) this should work for you.
I also added Google Code's prettify highlighter as an alternative. To enjoy the benefits of google-code highlighting your markup needs to specify a
class="prettyprint" attribute. It uses the Google CDN to deliver the JS so if you don't have access to the internets you won't see any highlighting. The related CSS is included in Mingus if you'd like to customize it to you compliment your templates.
To help better understand Mingus, and the references above, I plan on screencasting/posting these tidbits asmy schedule provides. The rest of the updates were mostly harmless refactoring of code, template updates, some i18n love, regular maintenance, bug support, and what have you. So let's see what goodies we have now...
The new digs
Without further ado, here are Mingus 0.9 additions (and one removal):
Description: A Django app that provides helpers for serving static files, used in Pinax.
Notes: How to handle serving static media in your project is always a good way to fire up a discussion. Managing them in a Django reusable app even more so. This project exists to resolve all those headaches. Jannis Leidel created this project in reflex to these static media management woes the Pinax team dealt with. It's one of those projects I believe should be considered for a
contrib app as it resolves a common issue every Django project will most likely run into.
Description: Django template loader for database stored templates with extensible cache backend.
Notes: Yet another project created by Jannis Leidel. The name is self-explanatory -- DbTemplates allows you to create templates in your database instead of the the file system, which allows editing via the Django admin. DbTemplates also allows you to override existing templates on the file-system by creating a new Template record. The benefit here is that you can allow edit access to those users who should not have access to the server. The negative is that source control is lost. Leveraging Django-Reversion is the suggestion solution to solve that versioning issue. I guess you'll see that in Mingus 1.0 :)
Currently Mingus does not have this enabled in the TEMPLATE_LOADERS settings, but the application is installed with Mingus by default. I'll most likely change this in HEAD so it's enabled by default. To enable this yourself all you need to do is specify the TEMPLATE_LOADER. Below is an example:
TEMPLATE_LOADERS = ( 'django.template.loaders.filesystem.load_template_source', 'django.template.loaders.app_directories.load_template_source', 'dbtemplates.loader.load_template_source', )
Description: Html compression as middleware and view decorators.
Notes: Middleware that slims down your HTTPResponse by removing extra white-space. This module is a django conversion of CheckoutableTemplates Zope package. Related, David Cramer published a post Spaceless HTML in Django which details his solution using Django Middleware for a similar perforance enhancement. You'll note that in the comments some readers noted alternative solutions as well. So far Django-Slimmer hasn't introduced anything but great results.
Description: Integration of jCrop with the Django admin.
Notes:Simon Willison initially released this nice little reusable to make image cropping in the admin easy. It's a terrific tool that allows you to easily crop images in the admin using JQuery and JQuery-Crop. I tried to integrate it with the Mingus project, and it worked well, but there were two issue I ran into so I forked it. First, Willison raised the issue I mentioned above regarding what to do with your static files when releasing a reusable app, "... no idea what
I should do with the static file dependencies though.". The second was the location of the ImageField "uploads" parameter which I like to set, if possible, in my project's
media/uploads/[projectname] directory. I forked the repo to include these changes. Willison noted that this project was not a complete project and it's even highlighted here. Maybe Chris Adams post Django: reliably saving URLs to a file field provides the answer?
Description: A statistics module for django. It stores requests in a database for admins to see, it can also be used to get statistics on who is online etc.
Notes: Created by Kyle Fuller, Django-Request is the one app I'm most concerned about including is also one of the kewlest. Django-request provides analytics on (you guessed it) any http request your application handles. It provides a lot of customization (I setup a few ignore rules that live in local_settings.py), and integrates Flot graphical plots. The "overview" view looks really amazing and is a great example on how you can customize the Django admin to fit your needs. The reason I'm concerned about using Django-Request is that it's database write intense, plus the overview page executes analytics on all your request records which unless kept tidy could become very expensive. But for a blog like mine, I'm not concerned just yet. To remove it all you need to do is comment out the middleware reference. It also provides a few management commands to dump old records. So, it's nice like that.
Update: Mingus and Django-Request have had a love/hate relationship. I'm mostly kidding here, but there have a been a few bumps in the road, all of which I've submitted patches (via my own fork) for or logged issues. Kyle has been terrific about getting the fixes in. If you're detailed you'll note that as of 0.9.5 I removed django-request from Mingus altogether. Then when 0.9.6 was announced we found another bug. So you'll see the updated migration SQL in the 0.9.7 tag. Anyway, it's a really interesting app that shows off some of the many cool things you can do with Django itself (management commands, admin customization, etc). So it's back in Mingus for your enjoyment. This is what happens though when you're running beta software -- It's part of the game. Thanks Kyle for your work, and thanks for those users who helped track down the bugs.
Description: Django admin extension that displays statistics about your memcached instances.
Notes:Martin Mahner is the author of this project. He provides a perfect, concise README file that details exactly what this project provides, so go check that out since it has nice screenshots and all that jazz.
Description: A Django app that manages bit.ly links to local objects.
Notes: This is the app used by django-twitter (below) to create bit.ly short urls when posting to twitter (Mingus allows you to fire off a twitter message when publishing a new blog post). The project provides additional features as well, so make sure to check it out. The Discovery Creative team is the author.
Description: A Django application for making Django textareas rich text editors. Certainly as a template tag and possibly as a form widget.
Notes:Daniel Greenfield is the author of this project. Because I'm a masochist I wanted to not only support Textile, Markdown, reStructureText, raw HTML, and TinyMCE so I added Django-WYSIWYG. By default the app renders the YUI WYSIWYG editor editor via the yahoo CDN. I've added the configuration settings to
settings.py so it defaults CKEditor. If you'd like for it to render the YUI WYSIWYG editor then just remove the DJANGO_WYSIWYG settings from
Notes: The first request I received for a WYSIWYG editor was for TinyMCE. It's a very successful project, and has numerous extensions and customization features. Some people just love their TinyMCE so it was hard to ignore it even knowing that it's younger, sexier competitor (CKEditor) was already included with Django-WYSIWYG. Mingus provides the basic implementation only, and that's all it will ever support. There appears to be multiple authors, so thanks to all of them.
Description: Twitter Django Integration.
Notes:Adam Miskiewicz is the author of this little utility app. I'm pretty sure he created it for a Mingus blog that has not yet launched. I'm itchin to see it though when it does. The application itself provides a model for adding your twitter auth via the Django admin and a signal for creating the bit.ly url for your object, and then the posting to twitter as well. Django-Twitter is tightly coupled to django-bitly and if you haven't set the required bit.ly settings values in your
settings.py file then publishing tweets post publishing won't work. Also, now that I think of it (and I just checked this out to confirm) it will post a tweet regardless of whether your post is set to Public or not. So yea, there's that as well :/
As I'm writing this I can't allow myself to complete this post without fixing the above issue so I've gone and created 0.9.2 tag for a fix, which includes a new signal in basic.blog to handle the posting, and it also decouples the need for bit.ly configuration. If you don't set your bit.ly credentials in
settings.py it will then revert to using
Site.domain + get_absolute_url() of the instance itself. At this point I'm considering refactoring django-twitter out of the mix in a later Mingus version as it now feels more like a basic-twitter app could handle this and is better suited as an addition to basic apps. That being said, Adam did a great job getting the initial legwork done. Thanks adam.
Description: A python wrapper around the Twitter API.
Notes: Used by django-twitter to post the tweets, of course. There appears to be multiple authors, so thanks to all of them.
Description: Intelligent schema migrations for Django apps.
Notes: I removed South as a requirement, not added it. None of the apps used in Mingus use South as their default migration tool, if they provide any migrations at all. It's sad actually. It should be the defacto Django migration solution. Does anyone disagree?
Well, before we can talk about 1.0 we need to discuss the near future, which includes supporting bug fixes and producing screencast tutorials. For now, those are the things I'm going to focus on. I'm thinking a "5 Days of Mingus" series, or something like that. For the near future, that's my goal. What is not next is adding anymore text editors to the project :)
What's up for 1.0?
- mobile theme
- docs site (more docs) reST/sphinx
- more test/test runner
- theme support (switching via admin)
- template update/clean up css
- project site
- pylint/code quality
- fabric/deploy helper
- 1.2 support
- A select few app additions that make sense (Django-Reversion, Django-DataTrans maybe, etc.)
How can you contribute?
Just keep forking baby... just keep forking. It's as simple as that. Fork, feature branch, test, merge, pull request. Repeat.
When will this all happen?
There will be no rush on pushing out a 1.0 release. Heck, if 1.0 were released by DjangoCon 2010 I'd be happy. I'm not ditching Mingus (it's the blog engine I use for my own personal site so I'm eating my own dog food), but as of recent my evenings and weekend schedule got plenty busy (new baby and home). It will be a "get to it when I can (or if others do)" type thing.
If you follow this project already you know I try very hard to resolve any issue that are filed as quickly as possible given my schedule. And I'll work with the rest of the contributors (who continue to develop on it) to progress the project as best as possible. Take a look at Mingus Network if you'd like to see who else is actively hacking on Mingus; there's some great stuff going on there.
With Mingus already being as feature rich as it probably will ever need to be, despite the few todo items listed above, the 1.0 release will be focused on stabilization, and proper project packaging.
Sites using Mingus today
One of the most motivating aspects of Mingus is seeing Mingus powered blogs go live in the wild. Below is a list of the blogs I'm aware of that are currently running Mingus (in no order). I'm sure I've missed a few. If so please comment with the URL of your Mingus powered blog:
Note: Additions to my original list:
Thanks to everyone who has launched a Mingus blog on their own. I hope it's been an enjoyable experience.
Finally, thanks to all those people who submitted issues, suggested ideas, committed code, evolved their own fork, etc. Your contributions in whatever form are greatly appreciated. I've added as many people as I could to the AUTHORS file that is packaged with Mingus. If you feel you were missed, just ping me and I'll make sure to add you. In the bigger picture of things I realize Mingus is an itsy, bitsy, tiny blip on the map but it's a fun project and I'm very happy to have passionate contributors and users of the project -- Django makes it easy doesn't it? Thanks again!