Open source repositories at: github and bitbucket. Current project: erp4all

Monday, September 3, 2012

pCMS - Ένα πολύ μικρό CMS σε django

pCMS - Ένα πολύ μικρό CMS σε django

Η django  συνοδεύεται από ένα πολύ χρήσιμο module το django.contrib.flatpages. Αυτό είναι υπεύθυνο γιατί την προβολή περιεχομένου που είναι αποθηκευμένο στην βάση. Είναι πολλές φορές που σελίδες δεν χρειάζεται να είναι δυναμικές γιατί το περιεχόμενο τους δεν αλλάζει όπως για παράδειγμα η άδεια χρήσης ή οι όροι και προϋποθέσεις ή στατικές πληροφορίες επιχείρησης (διεύθυνση, τηλέφωνο κλπ). Σε αυτές τις περιπτώσεις αυτό το module είναι πολύ χρήσιμο και εύκολο στην χρήση του.

Μπορούμε όμως να το πειράξουμε λίγο, να προσθέσουμε και μερικά ακόμα χαρακτηριστικά και να το κάνουμε ένα πολύ μικρό σύστημα διαχείρισης περιεχομένου (CMS). Θα προσθέσουμε τις εξής δυνατότητες σε κάθε σελίδα:
  • Πεδίο αν είναι δημοσιευμένη ή όχι
  • Πεδία για τα meta tags: description, keywords
  • Πεδία για προσθήκη javascript και css
Χρησιμοποιώντας και ένα δεύτερο module της django, το django.contrib.comments μπορούμε να προσθέσουμε σχόλια σε όποια/ες σελίδα/ες θέλουμε.

Θέλουμε όμως να υπάρχει και η δυνατότητα να εμφανίζουμε links με τις διευθύνσεις των σελίδων μας αυτόματα. Να μην αλλάζουμε το uls.py κάθε φορά που βάζουμε μια καινούργια ή αφαιρούμε μια παλιά. Θα ήταν ωραίο να εμφανίζουμε μενού με τις σελίδες που αναφέρονται σε ένα θέμα ομαδοποιημένες. Οι σελίδες για τα προϊόντα κάτω από ένα μενού, οι σελίδες των υπηρεσιών κάτω από άλλο μενού.

Προσθέτουμε και ένα απλό σύστημα αναζήτησης στις σελίδες μας και έχουμε το pico CMS. 

Ακολουθεί μια σύντομη περιγραφή των αλλαγών που χρειάστηκαν να γίνουν στο αρχικό module ώστε να εμπλουτιστεί με τα νέα στοιχεία.

Ξεκινώντας από τα μοντέλα θα δηλώσουμε ένα δικό μας με όνομα Flatpage και το οποίο θα κληρονομεί από το FlatPage της django.

from django.contrib.flatpages.models import FlatPage

class Flatpage(FlatPage):
    published = models.BooleanField(verbose_name=u"Published", default=True, blank=True)
    scripts = models.TextField(verbose_name=u"Scripts", blank=True)
    styles = models.TextField(verbose_name=u"Styles", blank=True)
    keywords = models.TextField(verbose_name=u"Keywords", blank=True)
    description = models.TextField(verbose_name=u"Description", blank=True)
Έχουμε έτοιμες τις επιπλέον πληροφορίες που θέλουμε για κάθε σελίδα. Θέλουμε όμως να εμφανίζονται μόνο αυτές που έχουν published==True. Το views.py όμως που υπάρχει με το django.contrib.flatpages τις δείχνει όλες. Το αντιγράφουμε και προσθέτουμε ένα τον όρο published=True στο get_object_or_404:


def flatpage(request, url):
    if not url.startswith('/'):
        url = '/' + url
    try:
        f = get_object_or_404(Flatpage, url__exact=url, sites__id__exact=settings.SITE_ID, published=True)
    except Http404:
        if not url.endswith('/') and settings.APPEND_SLASH:
            url += '/'
            f = get_object_or_404(Flatpage, url__exact=url, sites__id__exact=settings.SITE_ID, published=True)
            return HttpResponsePermanentRedirect('%s/' % request.path)
        else:
            raise
    return render_flatpage(request, f)

Για να ενεργοποιηθεί το δικό μας view και όχι του django.contrib.flatpages δεν χρησιμοποιούμε το δικό του middleware αλλά ένα δικό μας, αντιγραφή του προηγούμενου, αλλά αντί να κάνει import το django.contrib.flatpages.views, να κάνει το δικό μας.

Υπάρχει και template tag που έρχεται με το αρχικό module αλλά κι αυτό χρειάζεται να μετατραπεί ώστε να δείχνει μόνο τις δημοσιευμένες σελίδες.

Αυτές είναι και οι αλλαγές που χρειάζονται για εμπλουτίσουμε λίγο τις στατικές σελίδες.

Η δημιουργία των μενού γίνεται στο admin περιβάλλον.  Δίνοντας τον τίτλο του μενού και το url του. Το μενού θα φτιαχτεί σαν dropdown και θα περιέχει κάθε σελίδα που το url της αρχίζει με το url του μενού. Έτσι για παράδειγμα ένα μενού με url /services/ θα περιέχει όλες τις σελίδες που ξεκινάνε με /services/ όπως: /services/consulting/, /services/developing/.
Δεν υπάρχει όμως η δυνατότητα να έχουμε υπό μενού.

Τα μενού όπως και οι σελίδες έχουν την δυνατότητα να εμφανίζονται μόνο σε χρήστες που έχουν κάνει login. 

Προσθέσαμε και μια απλοποιημένη έκδοση του django.contrib.comments, όπου για να αποφύγουμε θέματα ασφάλειας και διαχείρισης, μόνο οι χρήστες που έχουν κάνει login μπορούν να σχολιάσουν σε μια σελίδα. Ο καθένας μπορεί να σβήσει τα δικά του σχόλια όποτε θέλει και ο admin μπορεί να τα σβήσει όλα.

Admin περιβάλλον

Καλά όλα αυτά αλλά να γράψεις html με το χέρι για να δημιουργήσεις σελίδες είναι λίγο χρονοβόρο. Υπάρχουν όμως έτοιμοι html editors που μπορούμε να χρησιμοποιήσουμε. Εδώ έχουμε χρησιμοποιήσει τον tinymce. Στον static φάκελο δημιουργούμε έναν νέο με το όνομα admin. Εκεί αποσυμπιέζουμε το tinymce. Δημιουργούμε ένα αρχείο textareas.js το οποίο θα είναι υπεύθυνο για την εκκίνηση του editor. Στον ορισμό του admin interface για την εφαρμογή μας (admin.py) ορίζουμε τα εξής:
    class Media:
        js = ('admin/tiny_mce.js','admin/textareas.js')
Έχουμε έτσι έναν rich text editor για να δημιουργήσουμε τις σελίδες μας. Εκτός όμως από αυτό έχουμε συνδέσει και έναν γραφικό filemanager, τον elFinder ώστε να μπορούμε να ανεβάζουμε εικόνες, αρχεία javascript και css. Έτσι γίνεται πιο εύκολη η δημιουργία των στατικών σελίδων.

Οι σελίδες χρησιμοποιούν σαν template το αρχείο fpd_default.html όταν δεν έχουν την δυνατότητα σχολίων και το fpg_comments.html όταν την έχουν. Μπορείτε να φτιάξετε ένα δικό σας αρχείο και να το ορίσετε σαν το template της σελίδας.

Αυτά είναι τα κύρια χαρακτηριστικά και οι βασικές τροποποιήσεις του pCMS. Κατεβάστε το από το github και πειραματιστείτε μαζί του. Απαιτείται μόνο η django 1.4.1 για να λειτουργήσει. Το βασικό module είναι το fpg και μπορεί να χρησιμοποιηθεί όπως είναι σε οποιοδήποτε άλλο project με ελάχιστες τροποποιήσεις.

Καλό hacking.

Andreas Porevopoulos
Lead Developer at
http://www.dream-solutions.gr



No comments:

Post a Comment