Skip to main content

Carrom tournaments management

Project description

This project contains some tools that make it easier the organization of a championship of Carrom.

The main component is a Pyramid application serving two distinct user interfaces:

  1. A very light, HTML only, read only view of the whole database, where you can actually browse thru the tourneys, seasons and players. You can see it in action on the public SoL instance at
  2. A complete ExtJS based desktop-like application, that exposes all the functionalities described below in an easy to manage interface, that you can try out visiting


SoL 3 requires Python 3.3 or higher, it does not work with Python 2


These are the key points:

  1. Multilingual application

    Scarry spoke only italian, because the i18n mechanism in Delphi (and in general under Windows) sucks. Most of the code was written and commented in italian too, and that made it very difficult to get foreign contributions

  2. Real database

    Scarry used Paradox tables, but we are in the third millenium, now: SoL uses a real, even if simple and light, SQL database under its skin

  3. Easy to use

    The application is usually driven by computer-illiterated guys, so little to no surprises

  4. Easy to deploy

    Gods know how many hours went in building f*cking installers with BDE goodies

  5. Bring back the fun

    Programming in Python is just that, since the beginning

High level description

The application implements the following features:

  • basic tables editing, like adding a new player, opening a new season, manually tweaking the scores, and so on;
  • handle a single tourney
    1. compose a list of competitors: usually this is just a single player, but there are two people in doubles, or more (teams)
    2. set up the first turn, made up of matches, each coupling two distinct competitors: if the tournament is associated with a rating this considers the Glicko2 rate of each player, otherwise uses a random coupling; either way, the arbiter is able to manually change the combinations
    3. print the game sheets, where the player will write the scores
    4. possibly show a clock, to alert the end of the game
    5. insert the score of each match
    6. compute the new ranking
    7. print the current ranking
    8. possibly offer a way to retire some competitors, or to add a new competitor
    9. compute the next turn
    10. repeat steps c. thru i. usually up to seven turns
    11. possibly offer a way to go back, delete last turn, correct a score and repeat
    12. recompute the ranking, assigning prizes
    13. update the rating the tournament is associated to
  • handle a season of tourneys
    • each tourney is associated to one championship
    • print the championship ranking
  • data exchange, to import/export whole tourneys in a portable way

Installation and Setup

The very first requirement to install an instance of SoL on your own machine is getting Python 3.3[1]. This step obviously depends on the operating system you are using: on most GNU/Linux distributions it is already available[2], for example on Debian and derivatives like Ubuntu the following command will do the task:

$ apt-get install python3.3

If instead you are using M$-Windows, you should select the right installer from the downloads page on Most probably you need to install also the Visual Studio 2010 Express, or alternatively just its runtime.

To be able to produce readable PDF you need to install also the DejaVu fonts. As usual, on GNU/Linux it’s a matter of executing the following command:

$ apt-get install fonts-dejavu

or equivalent for your distribution, while on M$-Windows you need to download them and extract the archive in the right location which usually is C:\Windows\Fonts.

Easiest way, SoLista

The easiest way is using SoLista, a buildout configuration that will perform most of the needed steps with a few clicks: this is particularly indicated if you are not fluent with the command line interface of your operating system.

Follow the hopefully clear enough steps in SoLista’s README.

The manual way

  1. Install SoL using pip:

    pip install SoL

    that will download the latest version of SoL from PyPI and all its dependencies as well

  2. Install ExtJS 4.2.1:

    python3.3 -m metapensiero.extjs.desktop
  3. Create a standard config file:

    soladmin create-config config.ini

    and edit it as appropriate

  4. Setup the database:

    soladmin initialize-db config.ini
  5. Load official data:

    soladmin restore config.ini
  6. Run the application server:

    pserve config.ini
  7. Enjoy!

    firefox http://localhost:6996/

    or, for poor Window$ users or just because using Python makes you happier:

    python -m webbrowser http://localhost:6996/


The complete sources are available on Bitbucket and can be downloaded with the following command:

git clone

After that, you can setup a development environment by executing the command:

pip install -r requirements/development.txt

If you are a developer, you are encouraged to create your own fork of the software and possibly open a pull request: I will happily merge your changes!

You can run the test suite with either

make test


python nosetests

I18N / L10N

Currently SoL is translated in english and italian. If you know other languages and want to contribute, the easiest way to create a new translation is to create an account on the Weblate site and follow its translators guide.

Otherwise if like me you prefer using more traditional tools[3] you can extract a copy of the sources and operate directly on the local catalogs under the directory src/sol/locale.

To extract translatable messages use the following command:

make update-catalogs

To check your work you must compile them with:

make compile-catalogs

Feedback and support

If you run in troubles, or want to suggest something, or simply a desire of saying “Thank you” raises up, feel free to contact me via email as lele at metapensiero dot it.

Consider also joining the dedicated mailing list where you can get in contact with other users of the application. There is also an issues tracker where you can open a new tickets about bugs or enhancements.

[1]As of this writing I’m using version 3.3.5, but SoL should work with the recently released Python 3.4 just as well.
[2]In fact it may even be already installed!
[3]GNU Emacs comes to mind of course, but there are zillions of them: start looking at the gettext page on Wikipedia.


3.0b2 (2014-07-13)

  • Fix serialization/deserialization when there is a full cycle of ownership

3.0b1 (2014-07-13)

  • Beta series, at last, as I do not foresee other disrupting changes
  • Use landscape orientation for the championship ranking printout, if needed
  • Do not allow nicknames that conflict with the admin or guest accounts
  • New “latest tourneys” page in the Lit interface

3.0a28 (2014-07-12)

  • More elegant Lit, SVG and PDFs URLs
  • Fix chicked-and-egg case in deserialization of owned clubs
  • Improve test coverage

3.0a27 (2014-07-10)

  • Fix argument handling in SVG rating chart

3.0a26 (2014-07-10)

  • Fix translations of the HTML interface

3.0a25 (2014-07-10)

  • Revamp the lit interface, using entities UUIDs instead of their internal integer keys and exposing the clubs and ratings

3.0a24 (2014-07-08)

  • The guest user cannot upload anymore, so it is effectively harmless
  • Prevent filtering and ordering on the Owner column
  • Show a popup window to remind that changes needs to be confirmed

3.0a23 (2014-07-06)

  • Add the concept of “ownership” on top-level entities, so different users cannot step on each other work in progress (see issue #1)
  • Activate a public mailing list and an issue tracker

3.0a22 (2014-06-16)

  • Show also the organizing club in the tourneys listing
  • Parametrize the formula used to compute match outcomes for the Glicko algorithm, introducing an exponential variant that takes into account the score difference
  • Fix score cards printout, using a smaller font for the competitors names
  • Fix data dump, there was an str/bytes issue when operating in non-debug mode

3.0a21 (2014-06-13)

  • Change the logic used to determine the current rate of a player, considering only the referenced rating and, when inherit is active, those at an higher level, not at the same level

3.0a20 (2014-06-12)

  • Fix generation of first turn when number of turns when the number of players is odd
  • Fix reordering of first turn combinations when the number of players is odd

3.0a19 (2014-06-10)

  • Fix the formula used to compute matches outcome, using the whole range of values from 0 to 1 instead of just 0, 0.5 and 1
  • Parametrize the lower and higher range of the interval used to interpolate players rates when the tourney’s competitors are (almost) all unrated

3.0a18 (2014-05-24)

  • New printout with the results of all played turns
  • Fix database upgrade logic

3.0a17 (2014-05-16)

  • Fix tourneys export, forgot to include the new phantomscore field

3.0a16 (2014-05-16)

  • Show also the player’s club after his name in the ranking printout
  • Allow customization of the score assigned to players in phantom matches
  • Do not delete historical rates when recomputing from scratch non-inheriting ratings

3.0a15 (2014-04-25)

  • Add an inherit flag to ratings, so the lookup behaviour for player’s rate lookup is a user choice
  • Align the two versions of the user manual
  • Minor tweaks to the lit interface

3.0a14 (2014-04-06)

  • Fix glitch in player’s rate lookup

3.0a13 (2014-04-05)

  • Fix PDF printouts font usage, using DejaVuSans also for the page decorations
  • soladmin create-config now asks for the admin password, instead of generating it randomly

3.0a12 (2014-04-04)

  • Fix glitch in the configuration template

3.0a11 (2014-04-04)

  • Fix overlaps in score cards printout
  • soladmin load-historical-rating is now able to use arbitrary formulas to compute rate, deviation and volatility

3.0a10 (2014-03-31)

  • Do not translate log messages
  • More detailed log of applied changes
  • Do not clobber existing information from an uploaded archive, as SoL 2 did
  • Impose a lower limit of 800 to the player’s rates computed by Glicko2

3.0a9 (2014-03-28)

  • Explicitly require Pillow, since ReportLab 3.0 does not

3.0a8 (2014-03-22)

  • Tested on Python 3.4
  • Require nssjson instead of simplejson
  • Minor tweaks to the player window, changing default fields visibility and slightly taller to show 23 records at a time

3.0a7 (2014-03-17)

  • Automatic check of the release date in CHANGES.rst
  • Fix compatibility with Python 3.4 using Chameleon 2.15
  • Fix another glitch when the guest user is not defined in the configuration

3.0a6 (2014-03-08)

  • Add a link to this section (on PyPI) to the login panel

3.0a5 (2014-03-06)

  • New command to update an existing configuration file

3.0a4 (2014-03-06)

  • Fix minor deploy issue with metapensiero.extjs.desktop

3.0a3 (2014-03-06)

  • Tweak the deployment infrastructure
  • Change package description to improve the chance it gets found
  • Some work on the user manuals

3.0a2 (2014-03-04)

  • Fix various deploy related issues

3.0a1 (2014-03-03)

  • Let’s try the release process!

Version 3

  • Glicko2 ratings, with graphical charts

  • Old championships are gone, old seasons has been renamed to championships

    People got confused by the overlapping functionality, old championships were an attempt to compute national-wide rankings: the new Glicko2-based ratings are much better at that

  • Augmented players information to fit international tourneys requirements, clubs may be marked as federations

  • Easier interfaces to insert and modify

  • Easier way to upload players portraits and clubs logos

  • Hopefully easier installation

  • Better infrastructure to accomodate database migrations

  • Simpler way to detect potential duplicated players

  • Most entities carry a GUID that make it possible to reliably match them when imported from a different SoL instance

  • Players merges are tracked and distribuited to other SoL instances

Dark ages

Scarry was a Delphi 5 application I wrote years ago, with the equivalent goal. It started as a “quick and dirty” solution to the problem, and Delphi was quite good at that. It has served us with good enough reliability for years, but since programming in that environment really bored me to death, there’s no way I could be convinced to enhance it further.

SoL is a complete reimplementation, restarting from scratch: it uses exclusively free software components, so that I won’t be embaraced to public the whole source code.

Project details

Release history Release notifications

History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


This version
History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Filename, size & hash SHA256 hash help File type Python version Upload date
SoL-3.0b2-py3.3.egg (3.5 MB) Copy SHA256 hash SHA256 Egg 3.3 Jul 13, 2014
SoL-3.0b2.tar.gz (4.9 MB) Copy SHA256 hash SHA256 Source None Jul 13, 2014

Supported by

Elastic Elastic Search Pingdom Pingdom Monitoring Google Google BigQuery Sentry Sentry Error logging CloudAMQP CloudAMQP RabbitMQ AWS AWS Cloud computing Fastly Fastly CDN DigiCert DigiCert EV certificate StatusPage StatusPage Status page