From b0ae2fea970d25d988906a99ab807904466cb2c7 Mon Sep 17 00:00:00 2001
From: Andrew Hutchings
Date: Wed, 1 Feb 2012 11:13:13 +0000
Subject: [PATCH] Fix lodgeit used in puppet
It appears the official lodgeit was abandoned in a broken state (I can't get it to work)
This branch switches to a hg branch of lodgeit that works and removes the need for the db hacks in the process
Change-Id: Ic4860e61b26bbde9bac7d5767e94ce066d244f78
---
modules/lodgeit/files/database.py | 202 ----------------------
modules/lodgeit/manifests/init.pp | 2 +-
modules/lodgeit/manifests/site.pp | 7 -
modules/lodgeit/templates/layout.html.erb | 55 +++---
4 files changed, 27 insertions(+), 239 deletions(-)
delete mode 100644 modules/lodgeit/files/database.py
diff --git a/modules/lodgeit/files/database.py b/modules/lodgeit/files/database.py
deleted file mode 100644
index ce4718756c..0000000000
--- a/modules/lodgeit/files/database.py
+++ /dev/null
@@ -1,202 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
- lodgeit.database
- ~~~~~~~~~~~~~~~~
-
- Database fun :)
-
- :copyright: 2007-2008 by Armin Ronacher, Christopher Grebs.
- :license: BSD
-"""
-import time
-import difflib
-from datetime import datetime
-from werkzeug import cached_property
-from sqlalchemy import MetaData, Integer, Text, DateTime, ForeignKey, \
- String, Boolean, Table, Column, select, and_, func
-from sqlalchemy.orm import scoped_session, create_session, backref, relation
-from sqlalchemy.orm.scoping import ScopedSession
-from lodgeit import local
-from lodgeit.utils import generate_paste_hash
-from lodgeit.lib.highlighting import highlight, preview_highlight, LANGUAGES
-
-from sqlalchemy.orm import mapper as sqla_mapper
-
-def session_mapper(scoped_session):
- def mapper(cls, *arg, **kw):
- cls.query = scoped_session.query_property()
- return sqla_mapper(cls, *arg, **kw)
- return mapper
-
-session = scoped_session(lambda: create_session(local.application.engine),
- scopefunc=local._local_manager.get_ident)
-
-metadata = MetaData()
-
-pastes = Table('pastes', metadata,
- Column('paste_id', Integer, primary_key=True),
- Column('code', Text),
- Column('parent_id', Integer, ForeignKey('pastes.paste_id'),
- nullable=True),
- Column('pub_date', DateTime),
- Column('language', String(30)),
- Column('user_hash', String(40), nullable=True),
- Column('handled', Boolean, nullable=False),
- Column('private_id', String(40), unique=True, nullable=True)
-)
-
-
-class Paste(object):
- """Represents a paste."""
-
- def __init__(self, code, language, parent=None, user_hash=None,
- private=False):
- if language not in LANGUAGES:
- language = 'text'
- self.code = u'\n'.join(code.splitlines())
- self.language = language
- if isinstance(parent, Paste):
- self.parent = parent
- elif parent is not None:
- self.parent_id = parent
- self.pub_date = datetime.now()
- self.handled = False
- self.user_hash = user_hash
- self.private = private
-
- @staticmethod
- def get(identifier):
- """Return the paste for an identifier. Private pastes must be loaded
- with their unique hash and public with the paste id.
- """
- if isinstance(identifier, basestring) and not identifier.isdigit():
- return Paste.query.filter(Paste.private_id == identifier).first()
- return Paste.query.filter(
- (Paste.paste_id == int(identifier)) &
- (Paste.private_id == None)
- ).first()
-
- @staticmethod
- def find_all():
- """Return a query for all public pastes ordered by the id in reverse
- order.
- """
- return Paste.query.filter(Paste.private_id == None) \
- .order_by(Paste.paste_id.desc())
-
- @staticmethod
- def count():
- """Count all pastes."""
- s = select([func.count(pastes.c.paste_id)])
- return session.execute(s).fetchone()[0]
-
- @staticmethod
- def resolve_root(identifier):
- """Find the root paste for a paste tree."""
- paste = Paste.get(identifier)
- if paste is None:
- return
- while paste.parent_id is not None:
- paste = paste.parent
- return paste
-
- @staticmethod
- def fetch_replies():
- """Get the new replies for the ower of a request and flag them
- as handled.
- """
- s = select([pastes.c.paste_id],
- Paste.user_hash == local.request.user_hash
- )
-
- paste_list = Paste.query.filter(and_(
- Paste.parent_id.in_(s),
- Paste.handled == False,
- Paste.user_hash != local.request.user_hash,
- )).order_by(pastes.c.paste_id.desc()).all()
-
- to_mark = [p.paste_id for p in paste_list]
- session.execute(pastes.update(pastes.c.paste_id.in_(to_mark),
- values={'handled': True}))
- return paste_list
-
- def _get_private(self):
- return self.private_id is not None
-
- def _set_private(self, value):
- if not value:
- self.private_id = None
- return
- if self.private_id is None:
- while 1:
- self.private_id = generate_paste_hash()
- paste = Paste.query.filter(Paste.private_id ==
- self.private_id).first()
- if paste is None:
- break
- private = property(_get_private, _set_private, doc='''
- The private status of the paste. If the paste is private it gets
- a unique hash as identifier, otherwise an integer.
- ''')
- del _get_private, _set_private
-
- @property
- def identifier(self):
- """The paste identifier. This is a string, the same the `get`
- method accepts.
- """
- if self.private:
- return self.private_id
- return str(self.paste_id)
-
- @property
- def url(self):
- """The URL to the paste."""
- return '/show/%s/' % self.identifier
-
- def compare_to(self, other, context_lines=4, template=False):
- """Compare the paste with another paste."""
- udiff = u'\n'.join(difflib.unified_diff(
- self.code.splitlines(),
- other.code.splitlines(),
- fromfile='Paste #%s' % self.identifier,
- tofile='Paste #%s' % other.identifier,
- lineterm='',
- n=context_lines
- ))
- if template:
- from lodgeit.lib.diff import prepare_udiff
- diff, info = prepare_udiff(udiff)
- return diff and diff[0] or None
- return udiff
-
- @cached_property
- def parsed_code(self):
- """The paste as rendered code."""
- return highlight(self.code, self.language)
-
- def to_xmlrpc_dict(self):
- """Convert the paste into a dict for XMLRCP."""
- return {
- 'paste_id': self.paste_id,
- 'code': self.code,
- 'parsed_code': self.parsed_code,
- 'pub_date': int(time.mktime(self.pub_date.timetuple())),
- 'language': self.language,
- 'parent_id': self.parent_id,
- 'url': self.url
- }
-
- def render_preview(self, num=5):
- """Render a preview for this paste."""
- return preview_highlight(self.code, self.language, num)
-
-mapper= session_mapper(session)
-
-mapper(Paste, pastes, properties={
- 'children': relation(Paste,
- primaryjoin=pastes.c.parent_id==pastes.c.paste_id,
- cascade='all',
- backref=backref('parent', remote_side=[pastes.c.paste_id])
- )
-})
diff --git a/modules/lodgeit/manifests/init.pp b/modules/lodgeit/manifests/init.pp
index f25a500636..87a1e15b1d 100644
--- a/modules/lodgeit/manifests/init.pp
+++ b/modules/lodgeit/manifests/init.pp
@@ -40,7 +40,7 @@ class lodgeit {
# otherwise get a new clone of it
exec { "get_lodgeit":
- command => "hg clone http://dev.pocoo.org/hg/lodgeit-main /tmp/lodgeit-main",
+ command => "hg clone https://bitbucket.org/dcolish/lodgeit-main /tmp/lodgeit-main",
path => "/bin:/usr/bin",
onlyif => "test ! -d /tmp/lodgeit-main"
}
diff --git a/modules/lodgeit/manifests/site.pp b/modules/lodgeit/manifests/site.pp
index 7a4b56b41d..7786e85857 100644
--- a/modules/lodgeit/manifests/site.pp
+++ b/modules/lodgeit/manifests/site.pp
@@ -33,13 +33,6 @@ define lodgeit::site($port, $image="") {
}
}
-# Database file needs replacing to be compatible with SQLAlchemy 0.7
-
- file { "/srv/lodgeit/${name}/lodgeit/database.py":
- replace => true,
- source => 'puppet:///modules/lodgeit/database.py'
- }
-
file { "/srv/lodgeit/${name}/manage.py":
mode => 755,
replace => true,
diff --git a/modules/lodgeit/templates/layout.html.erb b/modules/lodgeit/templates/layout.html.erb
index 0838fb948c..ae6d257ea4 100644
--- a/modules/lodgeit/templates/layout.html.erb
+++ b/modules/lodgeit/templates/layout.html.erb
@@ -1,11 +1,12 @@
+"http://www.w3.org/TR/html4/loose.dtd">
{{ page_title|e }} | LodgeIt!
-
-
+
+
+
{%- if css %}
@@ -23,23 +24,26 @@
<% else %>
<%= name.capitalize %> Pastebin
<% end %>
-
+
+
{%- for href, id, caption in [
- ('/', 'new', _('New')),
- ('/all/', 'all', _('All')),
- ('/about/', 'about', _('About')),
- ('/help/', 'help', '?')
- ] %}
-
- {{ caption|e }}
+ ('pastes/new_paste', 'new', _('New')),
+ ('pastes/show_all', 'all', _('All')),
+ ('static/about', 'about', _('About')),
+ ('static/help', 'help', '?')
+ ] %}
+
+ {{ caption|e }}
{%- endfor %}
{#
{% for lang, name in i18n_languages %}
-
-
+
+
+
+
{% endfor %}
#}
@@ -53,9 +57,9 @@
paste=paste.paste_id, paste_url=paste.url|e, parent_url=paste.parent.url|e %}
on {{ date }} someone replied to your paste
#{{ parent }} ,
- in paste #{{ paste }} . Click here to
- compare
- those two pastes .{% endtrans %}
+ in paste #{{ paste }} . Click here to {% endtrans %}
+
+ {%- trans %}compare those two pastes{% endtrans %} .
{% endfor %}
{% trans %}hide this notification{% endtrans %}
@@ -67,25 +71,18 @@
Welcome to the LodgeIt pastebin. In order to use the notification feature
a 31 day cookie with an unique ID was created for you. The lodgeit database
does not store any information about you, it's just used for an advanced
- pastebin experience :-). Read more on the about
- lodgeit page. Have fun :-){%- endtrans -%}
+ pastebin experience :-). Read more on the {% endtrans -%}
+ {% trans %}about lodgeit{% endtrans %}
+ {%- trans %} page. Have fun :-){%- endtrans -%}
+
+
+ {% trans %}hide this notification{% endtrans %}
- {% trans %}hide this notification{% endtrans %}
{% endif -%}
{% block body %}{% endblock -%}
-