2011-07-31 10:46:29 +02:00
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
2012-04-14 12:52:56 +02:00
openslides . config . models
2011-07-31 10:46:29 +02:00
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
2012-04-14 12:52:56 +02:00
Models for the config app .
2011-07-31 10:46:29 +02:00
: copyright : 2011 by the OpenSlides team , see AUTHORS .
: license : GNU GPL , see LICENSE for more details .
"""
2012-02-18 00:00:56 +01:00
from pickle import dumps , loads
2012-03-13 13:03:03 +01:00
import base64
2011-07-31 10:46:29 +02:00
from django . db import models
2012-04-14 12:52:56 +02:00
from django . dispatch import receiver
2012-04-14 14:31:09 +02:00
from utils . translation_ext import ugettext as _
2011-07-31 10:46:29 +02:00
2012-04-14 12:52:56 +02:00
from openslides . config . signals import default_config_value
2011-07-31 10:46:29 +02:00
2012-02-15 12:04:11 +01:00
class ConfigStore ( models . Model ) :
key = models . CharField ( max_length = 100 , primary_key = True )
2011-07-31 10:46:29 +02:00
value = models . CharField ( max_length = 100 )
def __unicode__ ( self ) :
2012-02-19 22:20:29 +01:00
return self . key
2011-07-31 10:46:29 +02:00
class Meta :
2012-02-15 12:04:11 +01:00
verbose_name = ' config '
2011-07-31 10:46:29 +02:00
permissions = (
2012-04-14 19:33:50 +02:00
( ' can_manage_config ' , _ ( " Can manage configuration " , fixstr = True ) ) ,
2011-07-31 10:46:29 +02:00
)
2012-02-15 12:04:11 +01:00
2012-04-14 12:52:56 +02:00
2012-03-13 13:03:03 +01:00
# TODO:
# I used base64 to save pickled Data, there has to be another way see:
# http://stackoverflow.com/questions/2524970/djangounicodedecodeerror-while-storing-pickled-data
2012-02-15 12:04:11 +01:00
class Config ( object ) :
2012-02-19 22:20:29 +01:00
def load_config ( self ) :
self . config = { }
for key , value in ConfigStore . objects . all ( ) . values_list ( ) :
2012-03-16 12:28:42 +01:00
self . config [ key ] = loads ( base64 . decodestring ( str ( value ) ) )
2012-02-19 22:20:29 +01:00
2012-02-15 12:04:11 +01:00
def __getitem__ ( self , key ) :
try :
2012-02-19 22:20:29 +01:00
self . config
except AttributeError :
self . load_config ( )
2012-04-14 12:52:56 +02:00
2012-02-19 22:20:29 +01:00
try :
return self . config [ key ]
except KeyError :
pass
2012-04-14 12:52:56 +02:00
for receiver , value in default_config_value . send ( sender = ' config ' , key = key ) :
if value is not None :
return value
return None
2012-02-15 12:04:11 +01:00
def __setitem__ ( self , key , value ) :
try :
2012-02-20 14:51:05 +01:00
c = ConfigStore . objects . get ( pk = key )
2012-02-15 12:04:11 +01:00
except ConfigStore . DoesNotExist :
c = ConfigStore ( pk = key )
2012-03-13 13:03:03 +01:00
c . value = base64 . encodestring ( dumps ( value ) )
2012-02-15 12:04:11 +01:00
c . save ( )
2012-04-14 09:47:34 +02:00
try :
self . config [ key ] = value
except AttributeError :
self . load_config ( )
self . config [ key ] = value
2012-02-15 12:04:11 +01:00
2012-04-14 12:52:56 +02:00
config = Config ( )
@receiver ( default_config_value , dispatch_uid = " config_default_config " )
def default_config ( sender , key , * * kwargs ) :
return {
2012-04-18 15:04:16 +02:00
' event_name ' : _ ( ' OpenSlides ' ) ,
' event_description ' : _ ( ' Presentation and voting system ' ) ,
' frontpage_title ' : _ ( ' Welcome ' ) ,
' frontpage_welcometext ' : _ ( ' Welcome to OpenSlides! ' ) ,
' show_help_text ' : True ,
' help_text ' : _ ( ' If you need any help wieth OpenSlides, you can find commercial support on our <a href= " http://openslides.org/en/support " >Webpage</a>. ' ) ,
2012-04-14 12:52:56 +02:00
} . get ( key )
2012-03-18 17:11:58 +01:00
from django . dispatch import receiver
from django . core . urlresolvers import reverse
from django . utils . importlib import import_module
import settings
from openslides . utils . signals import template_manipulation
2012-04-14 12:52:56 +02:00
@receiver ( template_manipulation , dispatch_uid = " config_submenu " )
2012-03-18 17:11:58 +01:00
def set_submenu ( sender , request , context , * * kwargs ) :
2012-04-12 14:20:05 +02:00
if not request . path . startswith ( ' /config/ ' ) :
2012-04-11 10:58:59 +02:00
return None
2012-03-18 17:11:58 +01:00
menu_links = [
2012-04-15 10:36:37 +02:00
( reverse ( ' config_general ' ) , _ ( ' General ' ) , request . path == reverse ( ' config_general ' ) ) ,
2012-03-18 17:11:58 +01:00
]
2012-04-15 10:36:37 +02:00
2012-03-18 17:11:58 +01:00
for app in settings . INSTALLED_APPS :
try :
2012-04-16 11:36:50 +02:00
mod = import_module ( app )
views = mod . views
views . Config
2012-03-18 17:11:58 +01:00
except ( ImportError , AttributeError ) :
continue
appname = mod . __name__ . split ( ' . ' ) [ 0 ]
2012-04-16 11:36:50 +02:00
selected = reverse ( ' config_ %s ' % appname ) == request . path
try :
title = mod . NAME
except AttributeError :
title = appname . title ( )
2012-03-18 17:11:58 +01:00
menu_links . append (
2012-04-16 11:36:50 +02:00
( reverse ( ' config_ %s ' % appname ) , _ ( title ) , selected )
2012-03-18 17:11:58 +01:00
)
2012-04-15 10:36:37 +02:00
menu_links . append (
( reverse ( ' config_version ' ) , _ ( ' Version ' ) , request . path == reverse ( ' config_version ' ) )
)
2012-03-18 17:11:58 +01:00
context . update ( {
' menu_links ' : menu_links ,
} )