diff --git a/apps/accounts/context_processors.py b/apps/accounts/context_processors.py index f0d673b2..b694fd65 100644 --- a/apps/accounts/context_processors.py +++ b/apps/accounts/context_processors.py @@ -37,6 +37,7 @@ from forms import AuthenticationForm + def accounts(request): login_form = AuthenticationForm() return {'login_form': login_form} diff --git a/apps/accounts/forms.py b/apps/accounts/forms.py index 29fed2cb..aa37a9a8 100644 --- a/apps/accounts/forms.py +++ b/apps/accounts/forms.py @@ -38,6 +38,7 @@ from django import forms import django.contrib.auth.forms + class AuthenticationForm(django.contrib.auth.forms.AuthenticationForm): """override the authentication form because we use the email address as the key to authentication.""" diff --git a/apps/accounts/tests.py b/apps/accounts/tests.py index b531a502..4940452b 100644 --- a/apps/accounts/tests.py +++ b/apps/accounts/tests.py @@ -40,10 +40,10 @@ from django.test import TestCase from django.core.urlresolvers import reverse from django.contrib.auth.models import User -from django.conf import settings from django.utils import simplejson as json from nose.tools import eq_, ok_ + class AccountsTestCase(TestCase): def test_login_long_username(self): @@ -127,7 +127,7 @@ def test_logout(self): assert self.client.login(username=user.username, password='secret') - response = self.client.get(url) # note: it's GET + response = self.client.get(url) # note: it's GET eq_(response.status_code, 302) path = urlparse(response['Location']).path eq_(path, '/') diff --git a/apps/accounts/urls.py b/apps/accounts/urls.py index c7f079c3..8cd1398c 100644 --- a/apps/accounts/urls.py +++ b/apps/accounts/urls.py @@ -36,7 +36,7 @@ 'Url mappings for accounts app' -from django.conf.urls.defaults import * +from django.conf.urls.defaults import patterns urlpatterns = patterns('accounts.views', (r'^login', 'login'), diff --git a/apps/accounts/views.py b/apps/accounts/views.py index c5500884..6ada2f0f 100644 --- a/apps/accounts/views.py +++ b/apps/accounts/views.py @@ -39,15 +39,11 @@ from django.contrib.auth.views import REDIRECT_FIELD_NAME -from django.shortcuts import render_to_response from django.http import HttpResponseRedirect, HttpResponse -from django.template import RequestContext from django.views.decorators import cache from django.core.context_processors import csrf from django.utils import simplejson as json -from django.views.decorators.csrf import csrf_protect from django.contrib.auth.views import login as django_login - from forms import AuthenticationForm @@ -65,6 +61,7 @@ def login(request): return response + @cache.cache_control(private=True) def user_json(request): result = {} diff --git a/apps/dashtags/templatetags/recurse.py b/apps/dashtags/templatetags/recurse.py index 8894f87c..e1dd8801 100644 --- a/apps/dashtags/templatetags/recurse.py +++ b/apps/dashtags/templatetags/recurse.py @@ -38,15 +38,13 @@ ''' from django import template -from django.utils.safestring import mark_safe -from django.utils.html import conditional_escape -from django.core.urlresolvers import reverse register = template.Library() templates_stack = [] + @register.tag(name="recurse_children") def do_recurse(parser, token): nodelist = parser.create_nodelist() @@ -57,23 +55,29 @@ def do_recurse(parser, token): parser.delete_first_token() return node + class RecurseNode(template.Node): def __init__(self, nodelist): self._nodelist = nodelist + def render(self, context): output = self._nodelist.render(context) return output + @register.tag(name="recurse") def do_depth(parser, token): tag_name, nodes, _as, varname = token.split_contents() return DepthNode(nodes, varname) + class DepthNode(template.Node): + def __init__(self, nodes, varname): self.vals = template.Variable(nodes) self.varname = varname self._nodelist = templates_stack[-1] + def render(self, context): nodes = self.vals.resolve(context) d = context.push() diff --git a/apps/dashtags/templatetags/simile.py b/apps/dashtags/templatetags/simile.py index 2b8fb3df..de965566 100644 --- a/apps/dashtags/templatetags/simile.py +++ b/apps/dashtags/templatetags/simile.py @@ -2,19 +2,19 @@ ''' from django import template -from django.utils.safestring import mark_safe from django.core.urlresolvers import reverse register = template.Library() + def simile(parser, token, apps, forceBundle=False): """Generic function for simile api inclusions """ args = token.split_contents()[1:] - simileurl = reverse('static', kwargs={'path':'simile/'}) - opts = {'bundle':'true', 'autoCreate': 'true'} + simileurl = reverse('static', kwargs={'path': 'simile/'}) + opts = {'bundle': 'true', 'autoCreate': 'true'} for arg in args: try: k, v = arg.split('=', 1) @@ -22,10 +22,10 @@ def simile(parser, token, apps, forceBundle=False): opts[k] = v except ValueError: pass - bundle = opts['bundle']=='false' and 'bundle=false' or None + bundle = opts['bundle'] == 'false' and 'bundle=false' or None if bundle is None and forceBundle: bundle = 'bundle=true' - autoCreate = opts['autoCreate']=='false' and 'autoCreate=false' or None + autoCreate = opts['autoCreate'] == 'false' and 'autoCreate=false' or None ajax_params = '&'.join(filter(None, [bundle])) if ajax_params: ajax_params = '?' + ajax_params @@ -38,7 +38,8 @@ def simile(parser, token, apps, forceBundle=False): script_tail = ''' })(); - + ''' % {'base': simileurl, 'params': ajax_params} loaders = [] next = None @@ -48,7 +49,9 @@ def simile(parser, token, apps, forceBundle=False): if next is not None: loaders += [' window.SimileAjax_onLoad = load_%s;' % next] loaders += [ - ' SimileAjax.includeJavascriptFile(document, "%(base)s%(app)s/%(app)s-api.js%(params)s");' % {'base': simileurl, 'app': app, 'params': params}, + ' SimileAjax.includeJavascriptFile(document, "%(base)s%(app)s/'\ + '%(app)s-api.js%(params)s");' % \ + {'base': simileurl, 'app': app, 'params': params}, '};'] next = app params = ajax_params @@ -70,4 +73,4 @@ def timeplot(parser, token): Includes timeline. """ - return simile(parser, token, ('timeline','timeplot'), forceBundle=True) + return simile(parser, token, ('timeline', 'timeplot'), forceBundle=True) diff --git a/apps/dashtags/tests.py b/apps/dashtags/tests.py index f9ae67d1..af27e991 100644 --- a/apps/dashtags/tests.py +++ b/apps/dashtags/tests.py @@ -2,12 +2,16 @@ import unittest from django import template + class Recurse(TestCase): - """Test the three tags for recursive templates, recurse, recurse_children, endrecurse.""" + """Test the three tags for recursive templates, recurse, recurse_children, + endrecurse.""" # no fixtures = [] def test_recurse(self): - t = template.Template("""{% load recurse %}{% recurse_children %}{% for item in items %}{{ item.value }} -{% if item.children %}{% recurse item.children as items %}{% endif %}{% endfor %}{% endrecurse %}""") + t = template.Template("""{% load recurse %}{% recurse_children %} +{% for item in items %}{{ item.value }} +{% if item.children %}{% recurse item.children as items %}{% endif %} +{% endfor %}{% endrecurse %}""") d = {"items": [{ "value": "root", @@ -26,11 +30,9 @@ def test_recurse(self): ]} c = template.Context(d) out = t.render(c) - self.assertEqual(out, """root - leaf1 - leafleaf1 - leaf2 -""") + self.assertEqual(out, + u'\nroot\n\n leaf1\n\n leafleaf1\n\n\n leaf2\n\n\n') + class Simile(unittest.TestCase): """Test the simile tags to include script tags for exhibit and timeplot.""" diff --git a/apps/l10nstats/models.py b/apps/l10nstats/models.py index c24064d3..b725cb6c 100644 --- a/apps/l10nstats/models.py +++ b/apps/l10nstats/models.py @@ -41,13 +41,15 @@ from life.models import Locale, Tree, Changeset from mbdb.models import Build + class ModuleCount(models.Model): """Abstraction of untranslated strings per module. - + Module is usually something like 'browser' or 'security/manager' """ name = models.CharField(max_length=50) count = models.IntegerField() + def __unicode__(self): return self.name + '(%d)' % self.count @@ -60,6 +62,7 @@ class Meta: unique_together = (('repository', 'ident'),) ''' + class Run(models.Model): """Abstraction for a inspect-locales run. """ @@ -79,13 +82,14 @@ class Run(models.Model): unchanged = models.IntegerField(default=0) keys = models.IntegerField(default=0) errors = models.IntegerField(default=0) - report = models.IntegerField(default=0) - warnings = models.IntegerField(default=0) + report = models.IntegerField(default=0) + warnings = models.IntegerField(default=0) completion = models.SmallIntegerField(default=0) @property def allmissing(self): - """property adding missing and missingInFiles to be used in templates etc. + """property adding missing and missingInFiles to be used in templates + etc. We keep track of missing strings in existing files and in new files separetely, add the two for the most stats here. @@ -93,7 +97,8 @@ def allmissing(self): return self.missing + self.missingInFiles def activate(self): - previous = Active.objects.filter(run__tree = self.tree, run__locale = self.locale) + previous = Active.objects.filter(run__tree=self.tree, + run__locale=self.locale) previousl = list(previous) if len(previousl) == 1: previousl[0].run = self @@ -103,15 +108,18 @@ def activate(self): previous.delete() Active.objects.create(run=self) if self.cleanupUnchanged: - UnchangedInFile.objects.filter(run__active__isnull=True).distinct().delete() + (UnchangedInFile.objects.filter(run__active__isnull=True) + .distinct().delete()) # fields and class method to convert a query over runs to a brief text dfields = ['errors', 'missing', 'missingInFiles', 'obsolete', 'completion'] + @classmethod - def to_class_string(cls, iterable, prefix = ''): - '''Convert an iterable list of dictionaries to brief output, and result. + def to_class_string(cls, iterable, prefix=''): + """Convert an iterable list of dictionaries to brief output, and + result. The input can be a values() query ending up on Run objects, and needs all the fields in dfields. The given prefix can be used if the @@ -119,7 +127,7 @@ def to_class_string(cls, iterable, prefix = ''): Yields triples of the input dictionary, the short text, and a classification, any of "error", "warnings", or "success". - ''' + """ for d in iterable: cmp_segs = [] cls = None @@ -149,8 +157,9 @@ class Run_Revisions(models.Model): """ run = models.ForeignKey(Run) changeset = models.ForeignKey(Changeset) + class Meta: - unique_together = (('run','changeset'),) + unique_together = (('run', 'changeset'),) managed = False diff --git a/apps/l10nstats/templatetags/run_filters.py b/apps/l10nstats/templatetags/run_filters.py index 0ec5e453..b6219b6c 100644 --- a/apps/l10nstats/templatetags/run_filters.py +++ b/apps/l10nstats/templatetags/run_filters.py @@ -40,29 +40,30 @@ from django import template from django.utils.safestring import mark_safe -from django.utils.html import conditional_escape from django.core.urlresolvers import reverse from l10nstats.models import Run register = template.Library() + @register.filter -def showrun(run, autoescape=None): - """Display a l10nstats.models.Run object in a template in a consistent manner. +def showrun(run): + """Display a l10nstats.models.Run object in a template in a consistent + manner. + + Since we're not accepting input strings we don't have to worry about + autoescaping. """ - if autoescape: - esc = conditional_escape - else: - esc = lambda x: x if not isinstance(run, Run): return mark_safe(" ") - fmt = '%%s' % reverse('l10nstats.views.compare') + fmt = ('%%s' % + reverse('l10nstats.views.compare')) missing = run.missing + run.missingInFiles data = {'missing': missing} for k in ('errors', 'total'): data[k] = getattr(run, k) - datastr = ' '.join('data-%s="%d"' % (k,v) for k,v in data.iteritems()) + datastr = ' '.join('data-%s="%d"' % (k, v) for k, v in data.iteritems()) cmp_segs = [] if run.errors: cmp_segs.append('%d error(s)' % run.errors) @@ -76,5 +77,3 @@ def showrun(run, autoescape=None): compare = ', '.join(cmp_segs) return mark_safe(fmt % (datastr, run.id, compare)) - -showrun.needs_autoescape = True diff --git a/apps/l10nstats/tests.py b/apps/l10nstats/tests.py index bfa4123a..4dc293a3 100644 --- a/apps/l10nstats/tests.py +++ b/apps/l10nstats/tests.py @@ -115,7 +115,7 @@ def test_index_with_wrong_args(self): """index() view takes arguments 'locale' and 'tree' and if these aren't correct that view should raise a 404""" url = reverse('l10nstats.views.index') - response = self.client.get(url, {'locale':'xxx'}) + response = self.client.get(url, {'locale': 'xxx'}) eq_(response.status_code, 404) locale, __ = Locale.objects.get_or_create( @@ -128,24 +128,22 @@ def test_index_with_wrong_args(self): name='Japanese', ) - response = self.client.get(url, {'locale':['en-US','xxx']}) + response = self.client.get(url, {'locale': ['en-US', 'xxx']}) eq_(response.status_code, 404) - response = self.client.get(url, {'locale':['en-US','jp']}) + response = self.client.get(url, {'locale': ['en-US', 'jp']}) eq_(response.status_code, 200) # test the tree argument now - - - response = self.client.get(url, {'tree':'xxx'}) + response = self.client.get(url, {'tree': 'xxx'}) eq_(response.status_code, 404) self._create_appver_milestone() assert Tree.objects.all().exists() tree, = Tree.objects.all() - response = self.client.get(url, {'tree':['xxx', tree.code]}) + response = self.client.get(url, {'tree': ['xxx', tree.code]}) eq_(response.status_code, 404) - response = self.client.get(url, {'tree':[tree.code]}) + response = self.client.get(url, {'tree': [tree.code]}) eq_(response.status_code, 200) diff --git a/apps/l10nstats/urls.py b/apps/l10nstats/urls.py index d6b0472b..1f3b2dfc 100644 --- a/apps/l10nstats/urls.py +++ b/apps/l10nstats/urls.py @@ -37,13 +37,13 @@ '''URL mappings for l10nstats application. ''' -from django.conf.urls.defaults import * +from django.conf.urls.defaults import patterns urlpatterns = patterns('l10nstats.views', (r'^$', 'index'), - (r'^l10n_status.json$','status_json'), + (r'^l10n_status.json$', 'status_json'), (r'^history$', 'history_plot'), (r'^compare$', 'compare', {}, 'compare_locales'), (r'^tree-status/([^/]+)$', 'tree_progress'), - (r'^grid$', 'grid'), # experimental, might not stay + (r'^grid$', 'grid'), # experimental, might not stay ) diff --git a/apps/l10nstats/views.py b/apps/l10nstats/views.py index 8e6c0ff6..624ff20b 100644 --- a/apps/l10nstats/views.py +++ b/apps/l10nstats/views.py @@ -48,7 +48,7 @@ from django.template.loader import render_to_string from django.template import RequestContext from django.http import (HttpResponse, HttpResponseNotFound, - HttpResponseNotModified, Http404) + Http404) from django.db.models import Min, Max from django.views.decorators.cache import cache_control from django.utils import simplejson @@ -58,6 +58,7 @@ from l10nstats.models import * from tinder.views import generateLog + def getRunsBefore(tree, stamp, locales): """Get the latest run for each of the given locales and tree. @@ -68,7 +69,7 @@ def getRunsBefore(tree, stamp, locales): while True: q = Run.objects.filter(tree=tree, locale__in=locales, srctime__lt=stamp) - q = q.order_by('-srctime')[:len(locales)*2] + q = q.order_by('-srctime')[:len(locales) * 2] q = q.select_related('locale') if q.count() == 0: return runs @@ -159,7 +160,8 @@ def proxy(request, path=None, base=None): } } -@cache_control(max_age=5*60) + +@cache_control(max_age=5 * 60) def status_json(request): """The json output for the builds. @@ -176,6 +178,7 @@ def status_json(request): 'missing', 'missingInFiles', 'report', 'warnings', 'errors', 'unchanged', 'total', 'obsolete', 'changed', 'completion'] + def toExhibit(d): missing = d['missing'] + d['missingInFiles'] result = 'success' @@ -185,21 +188,22 @@ def toExhibit(d): result = 'failure' elif d['obsolete']: result = 'warnings' - rd = {'id': '%s/%s' % (tree, locale), - 'runid': d['id'], - 'label': locale, - 'locale': locale, - 'tree': tree, - 'type': 'Build', - 'result': result, - 'missing': missing, - 'report': d['report'], - 'warnings': d['warnings'], - 'changed': d['changed'], - 'unchanged': d['unchanged'], - 'total': d['total'], - 'completion': d['completion'] - } + + rd = {'id': '%s/%s' % (tree, locale), + 'runid': d['id'], + 'label': locale, + 'locale': locale, + 'tree': tree, + 'type': 'Build', + 'result': result, + 'missing': missing, + 'report': d['report'], + 'warnings': d['warnings'], + 'changed': d['changed'], + 'unchanged': d['unchanged'], + 'total': d['total'], + 'completion': d['completion'] + } if 'errors' in d and d['errors']: rd['errors'] = d['errors'] if 'obsolete' in d and d['obsolete']: @@ -221,9 +225,8 @@ def homesnippet(request): }) - def teamsnippet(request, loc): - act = Run.objects.filter(locale = loc, active__isnull=False) + act = Run.objects.filter(locale=loc, active__isnull=False) week_ago = datetime.utcnow() - timedelta(7) act = act.filter(srctime__gt=week_ago) act = act.order_by('tree__code').select_related('tree') @@ -264,6 +267,7 @@ def history_plot(request): p = q2.filter(srctime__lt=starttime).order_by('-srctime')[0] except IndexError: pass + def runs(_q, p): if p is not None: yield {'srctime': starttime, @@ -290,8 +294,8 @@ def runs(_q, p): stamps = {} stamps['start'] = int(time.mktime(starttime.timetuple())) stamps['end'] = int(time.mktime(endtime.timetuple())) - stamps['previous'] = stamps['start']*2 - stamps['end'] - stamps['next'] = stamps['end']*2 - stamps['start'] + stamps['previous'] = stamps['start'] * 2 - stamps['end'] + stamps['next'] = stamps['end'] * 2 - stamps['start'] return render_to_response('l10nstats/history.html', {'locale': locale.code, 'tree': tree.code, @@ -302,6 +306,7 @@ def runs(_q, p): context_instance=RequestContext(request)) return HttpResponseNotFound("sorry, gimme tree and locale") + def tree_progress(request, tree): """Progress of all locales on a tree. @@ -331,7 +336,9 @@ def tree_progress(request, tree): if 'starttime' in request.GET: try: - starttime = datetime.utcfromtimestamp(int(request.GET['starttime'])) + starttime = datetime.utcfromtimestamp( + int(request.GET['starttime']) + ) except Exception: pass if starttime < allStart: @@ -351,12 +358,15 @@ def tree_progress(request, tree): initial_runs = getRunsBefore(tree, starttime, locales) - results = {} datadict = defaultdict(dict) for loc, r in initial_runs.iteritems(): - datadict[starttime][loc] = r.missing + r.missingInFiles + r.report + datadict[starttime][loc] = (r.missing + + r.missingInFiles + + r.report) for r in q2: - datadict[r.srctime][r.locale.code] = r.missing + r.missingInFiles + r.report + datadict[r.srctime][r.locale.code] = (r.missing + + r.missingInFiles + + r.report) data = [{'srctime': t, 'locales': simplejson.dumps(datadict[t])} for t in sorted(datadict.keys())] @@ -420,12 +430,15 @@ def grid(request): en = tuple(en) x.add(l10n) y.add(en) - table[(l10n,en)].append(run) + table[(l10n, en)].append(run) + X = sorted(x, key=lambda cs: cs.push and cs.push.push_date or epoch) - Y = sorted(y, key=lambda t: map(lambda cs: cs.push and cs.push.push_date or epoch, t)) + Y = sorted(y, key=lambda t: map(lambda cs: cs.push and + cs.push.push_date or + epoch, t)) rows = [] for y in Y: - row = [(x,y) in table and table[(x,y)] or None for x in X] + row = [(x, y) in table and table[(x, y)] or None for x in X] rows.append(row) return render_to_response('l10nstats/grid.html', {'X': X, @@ -462,22 +475,26 @@ def __init__(self, node, base): for e in self.value.get('obsoleteEntity', [])] entities.sort(key=lambda d: d['key']) self.entities = errors + warnings + entities + @classmethod def adaptChildren(cls, _lst, base=''): for node in _lst: yield JSONAdaptor(node, base) + def __iter__(self): if self.base: base = self.base + '/' + self.fragment else: base = self.fragment return self.adaptChildren(self.children, base) + @property def path(self): if self.base: return self.base + '/' + self.fragment return self.fragment + def compare(request): """HTML pretty-fied output of compare-locales. """ @@ -495,10 +512,9 @@ def compare(request): if 'keys' not in summary: summary['keys'] = 0 # create table widths for the progress bar - _width = 300 widths = {} for k in ('changed', 'missing', 'missingInFiles', 'report', 'unchanged'): - widths[k] = summary.get(k, 0)*300/summary['total'] + widths[k] = summary.get(k, 0) * 300 / summary['total'] return render_to_response('l10nstats/compare.html', {'run': run, 'nodes': nodes, diff --git a/apps/webby/management/commands/update_webby.py b/apps/webby/management/commands/update_webby.py index a08f18cf..74383a37 100644 --- a/apps/webby/management/commands/update_webby.py +++ b/apps/webby/management/commands/update_webby.py @@ -39,6 +39,7 @@ from webby.models import Project from webby.utils import update_verbatim_all, update_svn_all + class Command(BaseCommand): help = 'Updates stats on all webby projects' @@ -60,4 +61,3 @@ def handle(self, *args, **options): print(' Failed\n') print('Webby updated\n') - diff --git a/apps/webby/models.py b/apps/webby/models.py index 6133e1de..22248c8b 100644 --- a/apps/webby/models.py +++ b/apps/webby/models.py @@ -39,6 +39,7 @@ from life.models import Locale from django.contrib.auth.models import User + class ProjectManager(models.Manager): def active(self): return self.filter(is_archived=False) @@ -65,7 +66,7 @@ class Project(models.Model): code_repo_url = models.CharField(max_length=150, blank=True, null=True) stage_url = models.URLField(blank=True, null=True, verify_exists=False) final_url = models.URLField(blank=True, null=True, verify_exists=False) - # stage_auth_url can't be a URLField, because Django doesn't accept the + # stage_auth_url can't be a URLField, because Django doesn't accept the # //:@:/ syntax as valid stage_auth_url = models.CharField(max_length=250, blank=True, null=True) stage_login = models.CharField(max_length=80, blank=True, null=True) @@ -82,10 +83,10 @@ def __unicode__(self): class Weblocale(models.Model): - """ Many-to-Many proxy class for project/locale pairs - """ + """Many-to-Many proxy class for project/locale pairs.""" class Meta: unique_together = (("project", "locale"),) + project = models.ForeignKey(Project) locale = models.ForeignKey(Locale) requestee = models.ForeignKey(User, blank=True, null=True) diff --git a/apps/webby/urls.py b/apps/webby/urls.py index 4f3fafbe..064888cb 100644 --- a/apps/webby/urls.py +++ b/apps/webby/urls.py @@ -35,7 +35,7 @@ # # ***** END LICENSE BLOCK ***** -from django.conf.urls.defaults import * +from django.conf.urls.defaults import patterns, url from webby.feeds import AllOptinsFeed, PendingOptinsFeed urlpatterns = patterns('webby.views', diff --git a/apps/webby/utils.py b/apps/webby/utils.py index 3da0d57d..216e7046 100644 --- a/apps/webby/utils.py +++ b/apps/webby/utils.py @@ -59,19 +59,22 @@ def _read_webpage(url): patterns = { - 'verbatim': re.compile('\s+([^<]+)'), + 'verbatim': re.compile( + '\s+([^<]+)'), 'svn': re.compile('
  • ([^
  • ') } exclude_codes = ('templates', 'en-US') + def _get_locale_mapping(): config = ConfigParser.ConfigParser() config.readfp(open(os.path.join(PROJECT_PATH, 'mapping.cfg'))) for item in config.items("mapping"): locale_mapping[item[0]] = item[1] + def _extract_locales_from_verbatim(source): locales = [] if not locale_mapping: diff --git a/apps/webby/views.py b/apps/webby/views.py index ccda54e7..5092ca79 100644 --- a/apps/webby/views.py +++ b/apps/webby/views.py @@ -86,11 +86,11 @@ def project(request, slug): requestee=request.user) wlobj.save() LogEntry.objects.log_action( - user_id = request.user.pk, - content_type_id = ContentType.objects.get_for_model(wlobj).pk, - object_id = wlobj.pk, - object_repr = unicode(wlobj), - action_flag = ADDITION + user_id=request.user.pk, + content_type_id=ContentType.objects.get_for_model(wlobj).pk, + object_id=wlobj.pk, + object_repr=unicode(wlobj), + action_flag=ADDITION ) return HttpResponseRedirect('') else: