~doctormo/erato/trunk

« back to all changes in this revision

Viewing changes to art_website/common/utils.py

  • Committer: Martin Owens
  • Date: 2010-10-20 20:33:00 UTC
  • Revision ID: doctormo@gmail.com-20101020203300-9vsolpbwc2tbcxoc
Manual merge in changes from designhub branch for common directory.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#
2
 
# Copyright 2010, Martin Owens and Adnane Belmadiaf
3
 
#
4
 
# This program is free software: you can redistribute it and/or modify
5
 
# it under the terms of the GNU Affero General Public License as
6
 
# published by the Free Software Foundation, either version 3 of the
7
 
# License, or (at your option) any later version.
8
 
#
9
 
# This program is distributed in the hope that it will be useful,
10
 
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
 
# GNU Affero General Public License for more details.
13
 
#
14
 
# You should have received a copy of the GNU Affero General Public License
15
 
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
16
 
#
17
 
 
18
 
import email
19
 
import os
20
 
from copy import deepcopy
21
 
import subprocess
22
 
import datetime
23
 
 
24
 
from django.conf import settings
25
 
 
26
 
def write_log(job_name, log):
27
 
    stamp_dir = os.path.join(settings.PROJECT_PATH, 'data')
28
 
    log_file = os.path.join(stamp_dir, "%s.log" % job_name)
29
 
    if os.path.exists(log_file):
30
 
        os.remove(log_file)
31
 
    f = open(log_file, "a")
32
 
    f.write(log)
33
 
    f.close()
34
 
 
35
 
def run_job(which, interval, args=None):
36
 
    stamp_dir = os.path.join(settings.PROJECT_PATH, 'data')
37
 
    if not os.path.exists(stamp_dir):
38
 
        os.makedirs(stamp_dir)
39
 
    stamp_file = os.path.join(stamp_dir, "%s.stamp" % which)
40
 
    if not os.path.exists(stamp_file) or \
41
 
       datetime.datetime.utcfromtimestamp(os.path.getmtime(stamp_file)) + interval < datetime.datetime.now():
42
 
        pwd = os.getcwd()
43
 
        os.chdir(settings.PROJECT_PATH)
44
 
        p = subprocess.Popen(["./manage.py", which], stdout=subprocess.PIPE, 
45
 
                             stderr=subprocess.STDOUT, close_fds=True)
46
 
        log = p.stdout.read()
47
 
        p.communicate()
48
 
        os.chdir(pwd)
49
 
        open(stamp_file, "a").close()
50
 
        os.utime(stamp_file, None)
51
 
        write_log(which, log)
52
 
 
53
 
def flat_list(some_list):
54
 
    """
55
 
    >>> reduce(lambda a,b: a.extend(b) or a, [[2,3],[6],[66,34]])
56
 
    [2, 3, 6, 66, 34]
57
 
    """
58
 
    if not some_list:
59
 
        return []
60
 
    return reduce(lambda a,b: a.extend(b) or a, some_list)
61
 
    
62
 
 
63
 
def redirect(to, *args, **kwargs):
64
 
    from distutils.version import LooseVersion as V
65
 
    import django
66
 
    if V(django.get_version()) > V('1.1'):
67
 
        from django.shortcuts import redirect as red
68
 
    else:
69
 
        from shortcuts import redirect as red
70
 
 
71
 
    return red(to, *args, **kwargs)
72
 
 
73
 
 
74
 
def get_bzr_version(version_file, debug):
75
 
    """
76
 
    return the bzr revision number and version.
77
 
    """
78
 
 
79
 
    if not os.path.exists(version_file):
80
 
        return "version unknown"
81
 
 
82
 
    f = email.message_from_file(open(version_file))
83
 
    version = f["version"]
84
 
    bzr_revno = f["revno"]
85
 
    
86
 
    if debug:
87
 
        try:
88
 
            from bzrlib.branch import Branch
89
 
            branch = Branch.open_containing('.')[0]
90
 
            bzr_revno = branch.revno()
91
 
        except:
92
 
            pass
93
 
 
94
 
    return "version %s (rev %s)" % (version, bzr_revno)
95
 
 
96
 
class simple_iterator(object):
97
 
 
98
 
    def __init__(self, *args):
99
 
        self.values = []
100
 
        self.index = -1
101
 
        if len(args) == 1 and isinstance(args[0], (list, tuple, set)):
102
 
            self.values.extend(deepcopy(args[0]))
103
 
        else:
104
 
            self.values.extend(deepcopy(args))
105
 
    
106
 
    def get_next_index(self):
107
 
        if self.index + 1 >= len(self.values):
108
 
            self.index = 0
109
 
        else:
110
 
            self.index = self.index + 1
111
 
        return self.index
112
 
    next_index = property(get_next_index)
113
 
 
114
 
    def get_next(self):
115
 
        return self.values[self.next_index]
116
 
    next = property(get_next)
117
 
 
118
 
    def reset(self):
119
 
        self.index = -1
120
 
        return ''
121