diff --git a/requirements.txt b/requirements.txt index 9447f11..696abae 100644 --- a/requirements.txt +++ b/requirements.txt @@ -14,4 +14,3 @@ Markdown==2.3.1 Pygments==1.6 ipython==1.1.0 -python-dateutil==2.1 diff --git a/src/blog/locale/he/LC_MESSAGES/django.mo b/src/blog/locale/he/LC_MESSAGES/django.mo index 9417ffd..eba8f2d 100644 Binary files a/src/blog/locale/he/LC_MESSAGES/django.mo and b/src/blog/locale/he/LC_MESSAGES/django.mo differ diff --git a/src/blog/locale/he/LC_MESSAGES/django.po b/src/blog/locale/he/LC_MESSAGES/django.po index 41fd7a4..a007319 100644 --- a/src/blog/locale/he/LC_MESSAGES/django.po +++ b/src/blog/locale/he/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-01-13 22:24+0200\n" +"POT-Creation-Date: 2014-01-21 00:18+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,10 +18,13 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: views.py:50 +#: models.py:34 models.py:41 msgid "author" msgstr "מאת" -#: views.py:50 views.py:55 -msgid "date" -msgstr "תאריך" +#: templates/blog/_post.html:5 +msgid "by" +msgstr "על-ידי" + +#~ msgid "date" +#~ msgstr "תאריך" diff --git a/src/blog/models.py b/src/blog/models.py index d685ac9..189d8e8 100644 --- a/src/blog/models.py +++ b/src/blog/models.py @@ -8,53 +8,74 @@ from django.utils.translation import ugettext as _ -import dateutil.parser from codecs import open # fix opening unicode files +import datetime +import glob import markdown -import os +import re import UserDict from uni_meta import uni_meta # our modified unicode metadata markdown extension POSTS_PATH = "blog/posts" +# we decided that posts will be identified using a tuple of (year,month,day,slug) and the files are saved accordingly +# these three patterns below must agree with each other (and it's nicer if they agree with the urls) +POSTS_GLOB_PATTERN = "/*/*/*/*.md" +POSTS_FORMAT_PATTERN = "/%(year)s/%(month)s/%(day)s/%(slug)s.md" +POSTS_RE = re.compile(r'.*/(?P\d*)/(?P\d*)/(?P\d*)/(?P\w*)\.md$') class Post(object): """A pseudo-model for a blog post loaded from a single markdown file with its metadata""" - def __init__(self, slug): - with open('%s/%s.md' % (POSTS_PATH, slug), encoding='utf-8') as md_file: + def __init__(self, year, month, day, slug): # all fields in POSTS_FORMAT_PATTERN are needed + with open(POSTS_PATH + POSTS_FORMAT_PATTERN % locals(), encoding='utf-8') as md_file: md = markdown.Markdown(extensions=[uni_meta, 'codehilite']) html = md.convert(md_file.read()) - missing_fields = {_('author'), _('date')}.difference(md.Meta) + missing_fields = {_('author')}.difference(md.Meta) if missing_fields: raise RuntimeError("Blog post metadata is missing for '%s'. Please add: %s" % ( - slug, ', '.join(missing_fields))) + slug, ', '.join(missing_fields))) self.slug = slug self.html = html self.author = md.Meta[_('author')][0] - self.created_date = dateutil.parser.parse(md.Meta[_('date')][0]) + self.hidden = md.Meta.get("hidden") # we only care about the key here + self.year = year + self.month = month + self.day = day + self.created_date = datetime.date(self.year, self.month, self.day) -def list_posts(): - posts_dir_files = (os.path.splitext(f) for f in os.listdir(POSTS_PATH)) - return [slug for (slug, ext) in posts_dir_files if ext == ".md"] +def list_post_tuples(): + posts_dir_files = glob.glob(POSTS_PATH + POSTS_GLOB_PATTERN) + posts_matches = [POSTS_RE.match(path) for path in posts_dir_files] + posts_dicts = [match.groupdict() for match in posts_matches if match] + return [(int(post['year']), int(post['month']), int(post['day']), post['slug']) for post in posts_dicts] def get_posts(): - return {slug: Post(slug) for slug in list_posts()} + return {post_tuple: Post(*post_tuple) for post_tuple in list_post_tuples()} -class AllPosts(UserDict.IterableUserDict): +class AllPosts(UserDict.UserDict): """A singleton class to hold the posts lazily loaded from disk""" __posts = None + __posts_for_display = None def __init__(self, *args, **kwargs): - UserDict.IterableUserDict.__init__(self) + UserDict.UserDict.__init__(self) if not self.__posts: AllPosts.__posts = get_posts() + + if not self.__posts_for_display: + AllPosts.__posts_for_display = sorted([post for post in AllPosts.__posts.values() if not post.hidden], + key=lambda x: x.created_date, reverse=True) self.data = AllPosts.__posts + @staticmethod + def get_page(num=0, size=5): + return AllPosts.__posts_for_display[num:num+size] + -#TODO: add preloading of the posts (instantiate AllPosts) when in production mode? +#TODO: disable preloading of the posts when in development mode diff --git a/src/blog/posts/2014/1/15/InterviewWithOferBartal.md b/src/blog/posts/2014/1/15/InterviewWithOferBartal.md new file mode 100644 index 0000000..a8b93bb --- /dev/null +++ b/src/blog/posts/2014/1/15/InterviewWithOferBartal.md @@ -0,0 +1,45 @@ +מאת: שרון שמורק דפנר + +![עופר ברטל](/static/blog/images/OferBartal.jpg) + +#ראיון עם עופר ברטל תלמיד במחזור הראשון של ה-hackita +####שאלה: מה הביא אותך ל"סדנא לידע ציבורי" ול-hackita? +שמעתי על הסדנא מכמה מקורות במקביל: כתבה ב-ynet, חבר… התחברתי מאוד לרעיון שבבסיס האידאולוגיה של הסדנא. +מידע הוא דבר בסיסי לדמוקרטיה ובכלל, לכל תהליך של קבלת החלטות. +לפעמים אנחנו נאלצים לקבל החלטות בלי ידע רלוונטי, אבל כשיש לנו ידע, זה משפר את תהליך קבלת ההחלטות. +וכאן הסדנא ממלאת תפקיד חשוב ומאיישת נישה חסרה. + +####שאלה: איזה פרויקט בחרת לעשות? ולמה דווקא את הפרויקט הזה? +בחרתי לפתח פרויקט שקראתי לו "רכבת פתוחה". מטרת הפרויקט היא לספק מדד אלטרנטיבי לדיוק רכבות. +זה חשוב בעיני, כי המדד שרכבת ישראל מפרסמת מאוד חלקי. +הרכבת מפרסמת מדד יומי של אחוז הרכבות שאיחרו לתחנה האחרונה, ומתעלמת מרכבות שבוטלו. +אבל זה לא משקף את החוויה של הנוסעים. הרכבת עשויה להגיע בזמן לתחנה האחרונה אך לאחר לכל התחנות בדרך. +מבחינת הרכבת אין איחור אבל מבחינת הנוסעים כמובן שיש. +ראוי לציין בהקשר זה שהרכבת אמנם את מדד הדיוק היומי אבל לא מאפשרת גישה לנתונים הגולמיים שמהם הוא חושב. +כמו בהרבה פרויקטים של הסדנא חלק נכבד מהמאמץ הפיתוחי הוא לחלץ את הנתונים הגולמיים שבמדינה מודרנית צריכים להיות נגישים. +אני נוסע לא מעט ברכבת וחושב שזה כלי תחבורה מדהים. הייתי רוצה לראות את הרכבת בישראל מתפתחת לכדי אמצעי תחבורה יעיל ומדויק יותר. +יש לנו לאן להתפתח מהבחינה הזאת ומדינות בסביבה שאפשר לקחת מהם דוגמה. + +אני חושב שמדד טוב לרכבת, ובעצם לכל גוף, זה בסיס הכרחי לשיפור. +אם אתה יודע איפה אתה נמצא ומה אתה רוצה לשפר, אתה יכול לשפר ואם יש לך חיווי על מידת השיפור, זה גם נותן מוטיבציה לשפר. +היום אפילו אם ח"כ ירצה לקדם את נושא הדיוק של רכבות אין לו נתונים שדרושים כדי לגשת לפתרון הבעיה ולמדוד הצלחה. + +####שאלה: איך את נהנית עד כה מהמסגרת? האם היא תואמת את הציפיות שהיו לך? +הכיתה זו דרך טובה להתחבר לסדנא למי שלא ברור לו איך להשתלב בסדנא. +אני מצאתי בסדנא ובפרט בכיתה, מקום מפגש משותף לאנשים שהדברים שהסדנא עושה חשובים להם. +לא ידעתי איך להשתלב בסדנא, לא הכרתי את הטכנולוגיות ולא ידעתי באיזה פרויקט לקחת חלק. +דרך הכיתה מצאתי הזדמנות הן ללמוד את הטכנולוגיות והן להשתלב בעשייה. אחד הקשיים בפיתוח ווב הוא לדעת באיזה כלים להשתמש. +צריך לא רק לדעת ווב אלא גם את חזית הטכנולוגית של הווב. וזו תרומה ייחודית נוספת של הכיתה: אודי, המדריך של הכיתה לימד אותנו את הכלים הכי חדשים והכי טובים. + +####שאלה: מה את חושבת לעשות בהמשך במסגרת "הסדנא לידע ציבורי" עם הידע והניסיון שרכשת ב-hackita? +במסגרת התנדבותי בסדנא, אני מתכוונן להמשיך את הפרויקט של רכבת פתוחה. זה פרויקט גדול, אבל למזלי אני לא עובד עליו לבד. +יש פה חבר'ה ממש חזקים מבחינה טכנולוגית שהצטרפו אליי. רכבת פתוחה, משלבת אפליקציית אנדרואיד, שרת ווב ואלגוריתם לניתוח הנתונים. +בסדנא אין הרבה ניסיון באנדרואיד וזה דווקא חשוב כי כך מגיעים להרבה מאוד אנשים. אני מקווה שהפרויקט "רכבת פתוחה" ייתן כלים גם לפרויקטים אחרים להתפתח בכיוון של אפליקציות אנדרואיד. + + + + + + + + diff --git a/src/blog/posts/InterviewWithSharon.md b/src/blog/posts/2014/1/15/InterviewWithSharon.md similarity index 95% rename from src/blog/posts/InterviewWithSharon.md rename to src/blog/posts/2014/1/15/InterviewWithSharon.md index 4797e54..b78f1ea 100644 --- a/src/blog/posts/InterviewWithSharon.md +++ b/src/blog/posts/2014/1/15/InterviewWithSharon.md @@ -1,9 +1,10 @@ מאת: שרון שמורק דפנר -תאריך: 2013-01-15 + +![שרון שמורק דפנר](/static/blog/images/SharonDafner.jpg) #ראיון עם שרון שמורק דפנר תלמידה במחזור הראשון של ה-hackita -####שאלה: -מה הביא אותך ל"סדנא לידע ציבורי" ול-hackita? + +####שאלה: מה הביא אותך ל"סדנא לידע ציבורי" ול-hackita? אני מתנדבת בסדנא כבר זמן מה. התחלתי את דרכי בצוות חינוך דווקא. אמנם אני מתכנתת מנוסה אך לא היה לי שום ידע בפייתון, או טכנולוגיות ווב. אני שמחה מאוד שניתנה לי ההזדמנות ללמוד את הטכנולוגיות האלו ולאפשר גם לידע ולכישורים שלי בתכנות לבוא לידי @@ -17,6 +18,7 @@ עושה היא לתרום את חלקה לשינוי השיטה כך ששחיתות לא תתאפשר באותה הקלות כמו שהיא מתאפשרת במערכת הממשל שקיימת היום. שקיפות וציבור שמבין מה קורה סביבו הם התרופות הכי טובות שאני מכירה, לריפוי שחיתות. + ####שאלה: איזה פרויקט בחרת לעשות? ולמה דווקא את הפרויקט הזה? הפרויקט שבחרתי לעשות הוא להקים אתר שיאפשר לשתף מידע שרלוונטי למוסר התשלומים של משרדי הממשלה ותאגידים ציבוריים. המטרה היא ליצור מוטיבציה וכלים לשיפור מוסר @@ -28,7 +30,8 @@ לעשות בהם שינוי. מוסר תשלומים הוא נושא חשוב מכיוון שיש לו השלכה ישירה על האיתנות הכלכלית של ספקים קטנים ובינוניים במשק, ומה שחשוב לי באופן אישי: הוא נראה לי ממוקד ופשוט יחסית למימוש. בכל זאת יש לי עוד הרבה מה ללמוד… -####שאלה: איך את נהנית עד כה מהמסגרת? האם היא תואמת את הציפיות שהיו לך? + +####שאלה: איך את נהנית עד כה מהמסגרת? האם היא תואמת את הציפיות שהיו לך? אני מאוד נהנית מהמסגרת. גם מהשיעורים וגם מהחברים האחרים בכיתה. כולם אנשים יוצאי דופן במובן הטוב של המילה. אני חושבת שהסבירו לנו היטב למה לצפות כבר במיונים כך שלא היה מקום ליותר מידי הפתעות, אם זאת הופתעתי לגלות כמה הרבה חומר חדש יש לי @@ -36,6 +39,7 @@ חלקים נכבדים מהאתר כמעט בחינם אבל בכל זאת יש הרבה שצריך להבין לגבי מה שקורה מאחורי הקלעים והרבה ספריות שצריך ו/או כדאי להכיר כדי להוציא את המקסימום מהטכנולוגיה. + ####שאלה: מה את חושבת לעשות בהמשך במסגרת "הסדנא לידע ציבורי" עם הידע והניסיון שרכשת ב-hackita? אני מקווה להמשיך לקדם את הפרויקט שהתחלתי ב-hackita, אבל איהנה לא פחות להשתלב בכל צוות אחר שיש בסדנא. diff --git a/src/blog/posts/InterviewWithYoni.md b/src/blog/posts/2014/1/15/InterviewWithYoni.md similarity index 98% rename from src/blog/posts/InterviewWithYoni.md rename to src/blog/posts/2014/1/15/InterviewWithYoni.md index 4c1f694..72eaa46 100644 --- a/src/blog/posts/InterviewWithYoni.md +++ b/src/blog/posts/2014/1/15/InterviewWithYoni.md @@ -1,6 +1,10 @@ מאת: שרון שמורק דפנר -תאריך: 2013-01-15 + + +![יוני נאור](/static/blog/images/YoniNaor.jpg) + #ראיון עם יוני נאור תלמיד ב-hackita + ####שאלה: איך הגעת להיות מתנדב בסדנא ותלמיד בכיתה? הקשר שלי עם הסדנא התחיל לפני כשנתיים. הייתי פעיל במסגרת קבוצה של פעילים א-פוליטיים, והצעתי לקבוצה שנפתח לציבור נתונים פיננסים ואחרים של העיר אשדוד, העיר @@ -16,6 +20,7 @@ שמרים את הפרויקט יותר טוב ממה שאני וחבריי היינו מסוגלים להרים. על הכיתה שמעתי מהתכתובת של הסדנא. כרגע אני במקום בחיים שיש לי די הרבה זמן פנוי לתרום לחברה (רצון יש תמיד) והרגשתי שהכיתה פותחת לי דלת לעשות זאת. + ####שאלה: איזה פרויקט בחרת לעשות? ולמה דווקא את הפרויקט הזה? אני פעיל במספר פרויקטים. שתפתי פעולה עם תלמיד נוסף בכיתה, ארנון, וביחד "גירדנו" מאתר הכנסת את רשימת כל השדלנים בכנסת. ארנון ממשיך בפרויקט איסוף ועיבוד מידע מאתר @@ -31,6 +36,7 @@ התנהלות הצדק במדינה. מה קורה משלב התלונה ועד שלב מיצוי הדין. ההרגשה שלי היא שהרבה תלונות "הולכות לאיבוד" בדרך אל הצדק. אך הפרויקט שבראש מעייני הוא פרויקט פוליטי דווקא, הצד הטכנולוגי הוא שולי יחסית ובעתיד תשמעו עליו פרטים נוספים. + ####שאלה: איך אתה נהנה עד כה מהמסגרת? האם היא תואמת את הציפיות שהיו לך? היו לי ציפיות גבוהות מהכיתה בשל ההתרשמות המוקדמת שלי מחברי הסדנא. היה ברור לי שיהיה מעניין, כיף וכמובן שאלמד דברים חדשים. המציאות עלתה על הציפיות שהיו לי. @@ -42,11 +48,12 @@ זה המקום לומר שכל זה לא היה קיים בלי אודי. חומרי הלימוד, התרגילים וההדרכות המצוינות, כל אלו הם תרומה מאוד משמעותית ומרשימה שאודי תרם לנו ומגיע לו הרבה כבוד ותודות. -####שאלה: מה אתה חושב לעשות בהמשך במסגרת "הסדנא לידע ציבורי" עם הידע והניסיון -שרכשת ב-hackita? + +####שאלה: מה אתה חושב לעשות בהמשך במסגרת "הסדנא לידע ציבורי" עם הידע והניסיון שרכשת ב-hackita? אני מקווה לעשות הרבה. גם להמשיך בפרויקטים שהתחלתי במסגרת הכיתה וגם להשתלב בפעילות הקיימת בסדנא: גם הפעילות הטכנית וגם הפעילות במישור המדיני/אזרחי. אני מקווה, להביא לי ולעם הזה מציאות טיפ-טיפה יותר טובה. + ####שאלה: מה אתה חושב שקיבלת בכיתה ולא היית יכול לקבל במסגרת לימודים אחרת? האווירה של שיתוף פעולה בכיתה, שאנחנו לומדים מאודי ואחד מהשני, ותחושת ההצלחה שהסביבה נותנת לנו דוחפים אותנו קדימה, מאיצים את תהליך הלמידה ומאוד מקלים על diff --git a/src/blog/posts/JavaVsPython.md b/src/blog/posts/2014/1/15/JavaVsPython.md similarity index 95% rename from src/blog/posts/JavaVsPython.md rename to src/blog/posts/2014/1/15/JavaVsPython.md index a52d695..ba2706f 100644 --- a/src/blog/posts/JavaVsPython.md +++ b/src/blog/posts/2014/1/15/JavaVsPython.md @@ -1,5 +1,7 @@ מאת: שרון שמורק דפנר -תאריך: 2013-01-15 + + + #מותר הפייתון מהג'אווה בתור מתכנתת מנוסה ב-C++ ובג'אווה, השיעורים הראשונים בפייתון, הותירו אותי בהרגשה לא נוחה. הרבה מאי הנוחות נבעה מכך שבפייתון, בשונה מג'אווה, הקישור ל-type הוא @@ -14,8 +16,10 @@ שמצאתי את הסיבה בהא הידיעה או אפילו שהתשובה שמצאתי היא נכונה, אבל מצאתי תשובה שלכל הפחות היא מעניינת: לתשובה שמצאתי קוראים חוק בויד של האיטרציה. אתם יכולים לקרוא [כאן](http://www.codinghorror.com/blog/2007/02/boyds-law-of-iteration.html) -את הפוסט המקורי שממנו למדתי על החוק. לטובת עצלנים ולמי שמעדיף הסבר בעברית אני -אסכם אותו כאן בקצרה: בויד לא היה מהנדס תוכנה אלה מהנדס אווירונאוטיקה ששאל את +את הפוסט המקורי שממנו למדתי על החוק. + +לטובת עצלנים ולמי שמעדיף הסבר בעברית אני אסכם אותו כאן בקצרה: +בויד לא היה מהנדס תוכנה אלה מהנדס אווירונאוטיקה ששאל את עצמו את השאלה הבאה אודות 2 סוגים שונים של מטוסים. מטוס א' עלה בביצועיו כמעט בכל פרמטר שנחשב חשוב על מטוס ב' והיה הבחירה הראשונה של כל מהנדס אווירונטיקה. היתרונות של מטוס ב' על פני מטוס א' נחשבו זניחים (ראייה צידית טובה יותר ומערכת @@ -26,11 +30,13 @@ מהטיס במטוס ב' בעל ההיגוי ההידראולי. לאורך זמן המאמץ הנוסף עלה לטייס במהירות תגובה וכך למרות שמטוס א' הגיב מהר יותר למוט ההיגוי, במטוס ב' הטייס הפעיל את מוט ההיגוי מהר יותר. + הנחה בתקופתו של בויד הייתה שהמפתח לניצחון בקרב מטוסים אחד על אחד הוא: לאסוף נתונים, להעריך מצב, לתכנן ולפעול טוב יותר. על פי שיטה זו כל הקלפים הטובים הם בצד של מטוס א'. בהתבסס על ממצאיו, התובנה של בויד הייתה שהמפתח לניצחון הוא לאסוף נתונים, להעריך מצב, לתכנן ולפעול מהר יותר. לפי חוק בויד מהירות האיטרציה היא -הגורם הקובע בקרב ולאו דווקא איכותה. +הגורם הקובע בקרב ולאו דווקא איכותה. + חזרה לקרקע: חוק בויד מציע את האפשרות שאיטרציית פיתוח בפייתון מהירה יותר ושאולי זה הפרמטר הקריטי בפיתוח מוצר. אישית, אני מקווה, שהמשמעות בשטח היא, שגם כאשר מתפשרים על איכות בכל איטרציה, מהירות האיטרציה עוזרת להתכנס מהר יותר למוצר איכותי @@ -40,7 +46,6 @@ overflow. ישנם שני טיעונים מהפוסט שמצאתי ראויים פייתון ודומיה והשני מגן על ג'אווה/C++ ודומיה: - "__Those who would give up type safety to purchase a little temporary liberty, deserve neither liberty nor type safety.__" diff --git a/src/blog/posts/hello.md b/src/blog/posts/2014/1/15/hello.md similarity index 93% rename from src/blog/posts/hello.md rename to src/blog/posts/2014/1/15/hello.md index a299cd6..2b1291b 100644 --- a/src/blog/posts/hello.md +++ b/src/blog/posts/2014/1/15/hello.md @@ -1,5 +1,5 @@ מאת: יוני -תאריך: 2014-01-06 +hidden: # אנחנו בתוך המארקדאון ## כותרת משנית diff --git a/src/blog/static/blog/images/OferBartal.jpg b/src/blog/static/blog/images/OferBartal.jpg new file mode 100644 index 0000000..3eb153e Binary files /dev/null and b/src/blog/static/blog/images/OferBartal.jpg differ diff --git a/src/blog/static/blog/images/SharonDafner.jpg b/src/blog/static/blog/images/SharonDafner.jpg new file mode 100644 index 0000000..ee11a48 Binary files /dev/null and b/src/blog/static/blog/images/SharonDafner.jpg differ diff --git a/src/blog/static/blog/images/YoniNaor.jpg b/src/blog/static/blog/images/YoniNaor.jpg new file mode 100644 index 0000000..d51d9b5 Binary files /dev/null and b/src/blog/static/blog/images/YoniNaor.jpg differ diff --git a/src/blog/templates/blog/post_list.html b/src/blog/templates/blog/post_list.html index 5c34482..fee9d08 100644 --- a/src/blog/templates/blog/post_list.html +++ b/src/blog/templates/blog/post_list.html @@ -7,9 +7,9 @@
    - {% for slug, post in posts.items %} + {% for post in posts %}
  • - {{ post.slug }} + {{ post.slug }}
  • {% include 'blog/_post.html' %} diff --git a/src/blog/urls.py b/src/blog/urls.py index f4da4bc..9a2cc21 100644 --- a/src/blog/urls.py +++ b/src/blog/urls.py @@ -3,6 +3,6 @@ urlpatterns = patterns('', url(r'^$', views.BlogPostListView.as_view(), name='blogs'), - url(r'^(?P[-_\w\d]+)/$', views.BlogPostDetailView.as_view(), name='blog'), - + url(r'^(?P\d\d\d\d)/(?P\d\d?)/(?P\d\d?)/(?P[-_\w\d]+)$', + views.BlogPostDetailView.as_view(), name='blog'), ) diff --git a/src/blog/views.py b/src/blog/views.py index 8e27b6f..6f63583 100644 --- a/src/blog/views.py +++ b/src/blog/views.py @@ -1,22 +1,26 @@ from django.views.generic import TemplateView +from django.http import Http404 -from blog.models import AllPosts, Post +from blog.models import AllPosts class BlogPostListView(TemplateView): template_name = 'blog/post_list.html' - #TODO paging to show only 5 posts in each page, starting from most recent + #TODO add paging buttons def get_context_data(self, **kwargs): context = super(BlogPostListView, self).get_context_data(**kwargs) - context['posts'] = AllPosts() + context['posts'] = AllPosts().get_page() return context class BlogPostDetailView(TemplateView): template_name = 'blog/post_detail.html' - def get_context_data(self, slug, **kwargs): + def get_context_data(self, year, month, day, slug, **kwargs): context = super(BlogPostDetailView, self).get_context_data(**kwargs) - context['post'] = Post(slug) + context['post'] = AllPosts().get((int(year), int(month), int(day), slug)) + if not context['post']: + raise Http404("No such post found") + return context