2009-10-18 7 views
0

Dans le passé, j'ai créé un wiki Django, et il était assez simple de créer une table Page pour les entrées wiki actuelles, puis de stocker les anciennes révisions dans une table de révision. Plus récemment, j'ai décidé de créer un site Web sur Google App Engine, et j'ai utilisé du code wiki écrit par un autre programmeur. Parce qu'il a créé son modèle de page d'une manière compliquée (au moins pour moi) en utilisant des entités, je ne suis pas sûr de savoir comment créer la table de révision et l'intégrer à son modèle de page.Stocker des révisions wiki sur Google App Engine/Django - Modifier ce code existant

Voici le code approprié. Quelqu'un pourrait-il m'aider à écrire le modèle de révision, et intégrer l'enregistrement des révisions avec la méthode Save du modèle Page?

class Page(object): 

    def __init__(self, name, entity=None): 
    self.name = name 
    self.entity = entity 
    if entity: 
     self.content = entity['content'] 
     if entity.has_key('user'): 
     self.user = entity['user'] 
     else: 
     self.user = None 
     self.created = entity['created'] 
     self.modified = entity['modified'] 
    else: 
     # New pages should start out with a simple title to get the user going 
     now = datetime.datetime.now() 
     self.content = '<h1>' + cgi.escape(name) + '</h1>' 
     self.user = None 
     self.created = now 
     self.modified = now 

    def save(self): 
    """Creates or edits this page in the datastore.""" 
    now = datetime.datetime.now() 
    if self.entity: 
     entity = self.entity 
    else: 
     entity = datastore.Entity('Page') 
     entity['name'] = self.name 
     entity['created'] = now 
    entity['content'] = datastore_types.Text(self.content) 
    entity['modified'] = now 

    if users.GetCurrentUser(): 
     entity['user'] = users.GetCurrentUser() 
    elif entity.has_key('user'): 
     del entity['user'] 

    datastore.Put(entity) 

Soit dit en passant, ce code provient de: http://code.google.com/p/google-app-engine-samples/downloads/list

Je suis assez inexpérimenté avec des modèles GAE Django, et le mien ont tendance à être très simple. Par exemple, voici mon modèle pour un blog Article:

class Article(db.Model): 
    author = db.UserProperty() 
    title = db.StringProperty(required=True) 
    text = db.TextProperty(required=True) 
    tags = db.StringProperty(required=True) 
    date_created = db.DateProperty(auto_now_add=True) 

Répondre

0

J'ai créé ce modèle (qui imite la classe Page):

class Revision (db.Model): 
    name = db.StringProperty(required=True) 
    created = db.DateTimeProperty(required=True) 
    modified = db.DateTimeProperty(auto_now_add=True) 
    content = db.TextProperty(required=True) 
    user = db.UserProperty() 

Dans la méthode Save() de la classe Page, j'ai ajouté ce code pour enregistrer une révision, avant que je mis à jour les champs avec les de nouvelles données:

r = Revision(name = self.name, 
      content = self.content, 
      created = self.created, 
      modified = self.modified, 
      user = self.user) 
r.put() 

Je le wiki mis en place maintenant d'accepter un paramètre GET pour spécifier la révision que vous voulez voir ou modifier. Lorsque l'utilisateur veut une révision, je vais chercher la page de la base de données et remplacer le contenu de la page avec le contenu de la révision:

page = models.Page.load(title) 

if request.GET.get('rev'): 
    query = db.Query(models.Revision) 
    query.filter('name =', title).order('created') 
    rev = request.GET.get('rev') 
    rev_page = query.fetch(1, int(rev)) 
    page.content = rev_page.content 
+0

Votre modèle de données ici est raisonnable - c'est ce que j'aurais suggéré, pour la plupart. Toutefois, si vous avez retravaillé Page pour être un modèle au lieu d'utiliser le magasin de données directement, vous pouvez effectuer un traitement par lot sur la page et la révision, puis enregistrer un échange de données dans le magasin de données. –

1

Le code dans votre premier extrait est pas un modèle - c'est une classe personnalisée qui utilise le module datastore bas niveau. Si vous voulez l'étendre, je recommanderais de le jeter et de le remplacer par des modèles réels, suivant des lignes similaires au modèle d'article que vous avez démontré dans votre deuxième extrait. En outre, il s'agit de modèles App Engine, et non de modèles Django. Les modèles Django ne fonctionnent pas sur App Engine.

+0

Cela semble être une assez bonne réponse, et donné à nouveau le choix, je pourrais aller dans cette voie . Cependant, j'ai piraté une solution pour étendre ce code que je publierai. –

Questions connexes