Разработка архитектуры веб-сервиса закрытой социальной сети с использованием фреймворка Django

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    1,19 Мб
  • Опубликовано:
    2015-09-09
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Разработка архитектуры веб-сервиса закрытой социальной сети с использованием фреймворка Django

Федеральное агентство по образованию Российской Федерации

Государственное образовательное учреждение

высшего профессионального образования

"КУБАНСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ"

Кафедра математического моделирования






КУРСОВАЯ РАБОТА

Разработка архитектуры веб-сервиса закрытой социальной сети с использованием фреймворка Django





Работу выполнила студентка 4-го курса

Михно В.Д.

Краснодар - 2013

Научный руководитель,

Доцент, к. ф-м. н.

С.Е. Рубцов

Содержание

Введение

1. Анализ закрытых социальных сетей

2. Структура Web-приложения

2.1 База данных и административная часть

2.2 Логическая часть приложения и отображение данных на страницах

Заключение

Список использованных источников

Приложение А

Приложение В

Введение


В настоящее время количество социальных сетей в Интернете и численность их участников растет с невероятной быстротой. Социальные сети уже сегодня посещает более чем две трети онлайн-аудитории во всем мире, и это четвертая по популярности онлайн-категория после поисковых порталов, информационных порталов и программного обеспечения, которая опережает даже электронную почту (по данным компании Nielsen Online, исследующей онлайн поведение в 9 странах). По данным той же компании, использование онлайн-сообществ сегодня растет вдвое более быстрыми темпами, чем любой из четырех других секторов сети Интернета и в три раза быстрее, чем пользование Интернетом в целом. Социальные сети (social networks) привлекают людей, преследующих различные цели: поддержание контакта со старыми знакомыми и поиск новых, в т. ч. обустройство личной жизни; поиск работы, продвижение своего бизнеса, профессиональное общение; обмен информацией и медиаконтентом с другими пользователями. В России социальные сети развиваются с недавнего времени, но, не смотря на свою молодость многие сети, приобрели уже огромную популярность.

Социальная сеть, в современном её понимании, является интернет-сообщества пользователей, объединённых по какому-либо признаку на базе одного сайта, который и называется в этом случае социальной сетью. Главным фактором объединения пользователей в социальную сеть является какая-либо их общность - финансовое положение, пол, принадлежность к той или иной расе, национальности, вероисповеданию, профессии и так далее.

Интеграция обычных сайтов с внешними социальными сетями уже довольно активно вошла в нашу жизнь. Многие миллионы сайтов тесно интегрировались с самыми популярными сетями, и почти все новые проекты сегодня создаются с интеграцией по умолчанию. Это может быть в виде ссылок на официальные сообщества поклонников сайта в социальных сетях, могут быть кнопки отправки информации в социальные сети, кнопки "мне нравится", интеграция интернет-магазинов для продажи товаров, специальные приложения для работы с сетями, инструменты комментирования через социальные сети и многое другое. Следующим шагом будет создание специализированных платформ для интеграции, которые позволят создавать "социальную" экосистему внутри сайтов, и пользователи, будучи залогиненными в Facebook или VK, смогут получать все то же, что и в самой социальной сети, только при этом будучи на стороннем сайте. Тот же процесс можно будет сделать и в обратном направлении: пользователи смогут, не выходя из социальной сети, получать нужную им информацию со сторонних сайтов. В свою очередь, внешние сайты с удовольствием принимают инструменты интеграции, потому что это дополнительный приток посетителей из сетей, а значит, и дополнительная прибыль. Так социальные сети концентрируют в руках власть, можно сказать "подсаживают сайты на интеграцию".

В тоже время компании понимают важность организации коммуникации между пользователями внутри экосистем сайтов, не выпуская их наружу и не доверяя этот важный процесс потенциальному конкуренту. Ведь социальные сети быстро развиваются, а пользователи требуют новый контент, поэтому не исключается риск создания сетью контента, близкого группе сайтов, которые ранее интегрировались с определенной сетью, и тем самым превращение огромной социальной сети в прямого конкурента для более мелкого сайта или целого сегмента. Компании стараются создавать полезный социальный функционал, который будет единым целым с сайтом и сможет привлечь новых пользователей. Часто компании переделывают свои сайты в тематические социальные сети и увеличивают свою популярность в разы.

Некоторые работодатели запрещают пользоваться социальными сетями - не только ради экономии, но и чтобы воспрепятствовать утечке информации.

закрытая социальная сеть фреймворк

В данной курсовой работе представлена разработка веб-приложения, обеспечивающего социальные взаимоотношения между сотрудниками владельца данного приложения. Что позволяет не только свести риск потери конфиденциальной информации к минимуму, но и возможность ограничение доступа к социальным сетям, компенсируя это наличием собственной закрытой социальной сети.

1. Анализ закрытых социальных сетей


Кроме общедоступных "В Контакте" и Facebook, существуют закрытые частные социальные сети, членство в которых доступно только для избранных или для людей с определенной профессией. Рассмотрим некоторые из них.Одна из самых первых эксклюзивных европейских социальных сетей, принимающая только "людей из мира высокого искусства, которые определяются по трем параметрам". Вы должны быть приглашены кем-то из существующих членов данной сети, но даже в этом случае нет никакой гарантии, что вас примут. Руководит сетью 25−летний швейцарец Патрик Лиотард-Войт (Patrick Liotard-Vogt).

Рисунок 1 - Социальная сеть ASmallWorld

Одна из первых социальных сетей с элитными участниками была основана в 2001 году тремя немецкими бизнесменами. Членство обычно выдается по приглашению, хотя вы можете обратиться напрямую к создателям с просьбой о вступлении.

Создатели сети описывают ее как "оазис вдохновения и развлечений" для "космополитичного, независимого, значимого, толерантного, либерального нонконформиста".

Рисунок 2 - Decayenne

.ru

Evrika.ru - закрытая социальная сеть для российских врачей. Принадлежит медиа - группе "MedInform Healthcare Communications". Все страницы сайта, кроме главной, не индексируются поисковиками и доступны только зарегистрированным пользователям. Для получения доступа нужно быть действующим врачом, способным подтвердить свои профессиональные знания и факт работы в медицинском учреждении.

Имеется как социальная составляющая: профили пользователей, обмен контактами и сообщениями, группы, комментарии; так и внутренний информационный портал: медицинские новости, перепечатки научных статей из российских и зарубежных журналов, оригинальные публикации медиков экспертного уровня.

По нашему мнению, сайт нацелен на доходы от продвижения лекарств, медоборудования и других изделий для здравоохранения в профессиональную среду. Это подтверждает его интеграция с ресурсом "МедМнение". Последний в интересах фармацевтических компаний проводит опросы среди врачей и платит деньги за участие в них.

Социальная сеть для адвокатов.

Недавно созданная закрытая социальная сеть адвокатов набирает обороты. Адвокатское сообщество России включает примерно 65000 человек.65000 человек профессиональных юристов, объединенных Федеральным Законом "Об адвокатской деятельности и адвокатуре в Российской Федерации", кодексом профессиональной этики адвоката. Каждый адвокат, пришедший в сеть, чувствует родную среду, плечо коллеги, единство интересов и профессионализм.

Структура закрытой социальной сети адвокатов синхронна существующей в России структуре адвокатского сообщества. Адвокаты объединены в группы адвокатских Палат регионов.

В сети нет ников, каждый знает с кем общается, ведь адвокат - открытая профессия.

В сети нет места бюрократии, рекламе и платным услугам. Сеть создана адвокатами и для адвокатов.

Закрытость проекта обусловлена не тайнами и интригами, а особым языком и наречием. Темы и вопросы, обсуждаемые адвокатами, связаны именно с профессией. Информационная площадка, объединяющая всех адвокатов России от Республики Адыгея до республики Саха, дает возможность профессионального общения и установления горизонтальных связей.

Разрозненная информация из адвокатских Палат регионов и адвокатских образований собирается в одном месте и становится доступной каждому адвокату.

Сеть дает возможность общаться, обменяться опытом, обсуждать правоприменительную практику, получить помощь коллеги и реальный практический совет.

Постановка задачи

С помощью свободно распространяемого фреймворка Django для веб-приложений, на языке Python, разработаем веб-приложение, компонентами которого будут основополагающие части социальной сети: отправка сообщений, поиск друзей, главная страница пользователя и лента новостей.

Первое что необходимо сделать, это подключить модуль регистрации django-registration и систему идентификации пользователей, предоставляющую работу с пользователями, группами пользователей, правами и сессиями пользователей, работающими через cookies. Эта система представляется приложением django. contrib. auth., обеспечивающее доступ к модели User, которая будет отвечать за базу данных, в которую будут заноситься все регистрируемые пользователи. Без регистрации доступ к страницам будет ограничен.

Весь функционал сайта разбит на 4 приложения. Первое должно будет осуществлять отображение и редактирование личной информации. Второе отображение новостей для всех пользователей. Третье поиск друзей по логину, фамилии, имени или отчеству, а также возможность отправки сообщения, добавления, удаления, отклонения и принятия в друзья другого пользователя. И последнее четвертое, будет отвечать за обмен сообщениями между пользователями.

Каждое приложение будет состоять из двух частей:

·        Общедоступная часть, которая дает людям возможность управлять своим профилем.

·        Административная часть, которая позволит администратору редактировать базу данных сайта.

Эти две части будут реализовываться следуя шаблону Модель-Представление-Контроллер (Model-View-Controller, MVC). Примем, что MVC определяет способ разработки программного обеспечения при котором код для определения и доступа к данным (модель, файл models. py) отделен от логики приложения (управление, файл views. py), которая в свою очередь отделена от интерфейса пользователя (представление, файл html).

2. Структура Web-приложения


Как мы уже сказали, наше приложение будет строиться основываясь на шаблоне MVC. MVC - это схема использования нескольких шаблонов, с помощью которых модель данных приложения, пользовательский интерфейс взаимодействие с пользователем разделены на три отдельных компонента так, что модификация одного из компонентов оказывает минимальное воздействие на остальные.

Основой проекта будут manage. py, __init__. py, settings. py, urls. py, wsgi. py.

·        manage. py скрипт, который позволяет вам взаимодействовать с проектом Django.

·        __init__. py пустой файл, который указывает Python, что текущий каталог является пакетом Python.

·        settings. py настройки/конфигурация проекта.

·        urls. py конфигурация URL-ов для вашего проекта Django. Это "содержимое” всех Django-сайтов.

·        wsgi. py точки входа для WSGI-совместимый веб-серверов.

Содержимое этих файлов представлено в ПРИЛОЖЕНИИ А.

Скачав и подключив модуль django-registration, и установив приложение django. contrib. auth., можем переходить к той части проекта, которая будет отвечать за функционал нашего сайта.

2.1 База данных и административная часть


Рассмотрим модельную часть приложения, отвечающую за главную страницу и редактирование данных пользователя.

Класс Profile будет содержать поля типа AutoOneToOneField, ImageField, TextField, CharField и ManyToManyField.- связь один-к-одному, в отличие от связи многие-ко-многим возвращает один объект. Указывает на модель User и осуществляет доступ к объекту данной модели.

Поле ImageField - предназначено для загрузки изображения.

Рисунок 3 - Поле User типа AutoOneToOneField и поле Иконка типа ImageField

Поле TextField - большое текстовое поле. Интерфейс администратора отображает поле как <textarea>.- Строковое поле для хранения коротких или длинных строк. Интерфейс администратора отображает поле как <input type="text">.- Связь многое-ко-многому. Принимает позиционный аргумент: класс связанной модели. В нашем случае мы используем это поле для определения друзей для каждого пользователя. Использование в качестве позиционного аргумента 'self', позволяет нам создать рекурсивную связь, т.е. объект со связью многие-ко-многим на себя. Это значит, что мы будем помещать в это поле ссылки на объекты из этой же модели.

В этом же файле models. py будут описаны две модели Message и Chat, которые позволяют обмениваться сообщениями между друзьями.

Модель Message содержит два поля AutoOneToOneField, DateTimeField, определяющее поле для ввода даты, CharFiels, TextField и BooleanField (Рис.4). Последнее нам необходимо для определения, что сообщение отправлено и принято (т.е. прочитано). Это поле будет заполняться галочкой, когда получатель зайдет на страницу СООБЩЕНИЯ и просмотрит чат, в котором появилось новое сообщение.

Рисунок 4 - Административная часть. Модель Message.

Что касается модели Chat, так она предназначена для распределения всех объектов модели Message на чаты. Модель содержит два поля многое-к-одному - ForeignKey, ссылающиеся на модель User, для определения участников чата, и поле ManyToManyField для хранения объектов модели Message, пара получатель и отправитель которых соответствует двум полям ForeignKey модели Chat (Рис.5).

Рисунок 5 - Модель Chats. Объект модели содержащий 3 поля: первые два для определения участников чата, а второе для хранения объектов модели Message.

Теперь перейдем к файлу models. py приложения отвечающего за новостную ленту.

Две модели Blog и Comment. Модель Blog ссылается, с помощью поля ManyToManyField, на модель Comment. Модель Comment содержит два поля типа TextField для распределения текста новости.

Если текст оказывается слишком большим, то пользователь большую часть отправляет в нижнее поле, и на странице появляется новость только с тем, что было в первом поле и ссылка "читать полностью >>".

При нажатии на эту ссылку появляется полный текст с возможностью комментировать его.

Так как эти две модели похожи на Message и Chat, поэтому не будем останавливаться на них. Они представлены в ПРИЛОЖЕНИИ В.

2.2 Логическая часть приложения и отображение данных на страницах


Функционал главной страницы представлен двумя функциями my_profile и user_settings.

По названиям можно догадаться, какая функция за что отвечает. Первая my_profile, будет отображать главную страницу пользователя (Рис. 6):

Рисунок 6 - Отображение данных модели Profile.

Как мы видим, внизу всех данных есть ссылка на редактирование своих данных. Все поля для ввода каких-либо данных реализуются с помощью модельных форм, которые аналогичны моделям, или просто форм. И те и другие реализуются с помощью вспомогательных классов, которые описаны в ПРИЛОЖЕНИИ В.

Рисунок 7 - Редактирование данных модели Profile.

Весь код данных страниц представлен в ПРИЛОЖЕНИИ B.

Приложение, отвечающее за поиск друзей, позволяет находить по фамилии, имени, отчеству и логину пользователя (Рис. 8).

Рисунок 8 - Поисковая форма

При нажатии на ссылку "Добавить в друзья", искомый пользователь заносится в модель Profile в поле friends (ManyToManyField) и у, добавляемого в друзья, пользователя в поле friend_requests модели Profile отмечается тот пользователь, который только что прошел по ссылке "Добавить в друзья" (Рис. 9).

Рисунок 9 - Административная часть. Поле ManyToManyField - friend_requests. В этом поле выделяется синим пользователь, который хочет добавиться в друзья.

На странице у добавленного друга автоматически появится оповещение о пользователе, который его добавил в друзья и две ссылки "Принять друга" и "Отклонить друга".

После этих операций у вас появляется список пользователей, которых вы добавили себе в друзья, с возможностью удалить друга или написать ему сообщение (Рис. 10).

Рисунок 10 - Страница с моими друзьями и возможностью поиска новых.

Теперь рассмотрим функционал обмена сообщениями. При прохождении в меню по ссылки СООБЩЕНИЯ мы попадаем на страницу где показаны лишь чаты и их последние объекты из поля ManyToManyField - messages (Рис. 11).

Рисунок 11 - Страница сообщений. Отображение содержимого модели Chat.

Как мы видим на Рис. 11 отобразилось одно поле, которое содержит логин собеседника, дату последнего сообщения и само сообщение. Если кто то присылает сообщение, то возле ссылки СООБЩЕНИЯ появляется число, указывающее сколько новых сообщений (Рис. 12). Django позволяет самим создавать теги, описывая их действия на языке Python. Реализация этого шаблонного тега представлена в ПРИЛОЖЕНИИ В.

Рисунок 12 - Отображение появления нового сообщения.

В шаблоне вызов шаблонного тега осуществляется следующим образом:

<p>СООБЩЕНИЯ{% if user. id|message_count %} ({{ user. id|message_count}}) {% endif %}</p>

Далее заходим в СООБЩЕНИЯ и нажимаем на чат. Внизу чата видим что новое сообщение отображается синим (Рис.13). При обновлении страницы синий фон заменяется белым, как и у всех остальных сообщений.

Рисунок 13 - Отображение всех сообщений в данном чате.

При отправке нового сообщения, оно также будет становиться синим и у самого отправителя, до тех пор, пока получатель его не прочтет (Рис. 14).

Рисунок 14 - Отправка сообщения собеседнику.

Ну и теперь переходим к последней части сайта - НОВОСТИ.

Страница содержит сортировку по датам, отображение всех новостей и возможность добавлять свои новости (Рис. 15).

Рисунок 15 - Страница НОВОСТИ

Поля "Архивы" генерируются автоматически при добавлении новой новости с другим месяце и годом. При прохождении по одной из таких ссылок на страницу отображаются только те новости, у которых дата публикации обладает таким же месяцем и годом. При переходе по ссылке "Читать полностью >>", мы переходим на страницу, которая отображает всю новость, и внизу появляется поле для ввода комментария (Рис.16). Система отображения новых комментариев такая же как и у сообщений. Пока отправитель новости не прочтет новый комментарий, фон будет оставаться синим.

Рисунок 16 - Просмотр всей новости и комментариев к ней.

При нажатии на ссылку "Отправить сообщение", появляется форма для написания новости (Рис.17). Как мы уже говорили в разделе 3.1, если текст слишком велик, то пользователь может разбить его на две части, так что бы на главной странице новостей была видна только первая часть новости.

Рисунок 17 - Форма для заполнения новости.

Заключение


Результатом данной работы является разработка четырех приложений и построенная модель данных с помощью классов Python, по которой сгенерировалась схема базы данных. Данное приложение реализует все поставленные задачи.

Приложение будет полезно для крупных фирм, которым необходим постоянный и быстрый обмен информации, при этом минимизируя утечку информации за пределы данного сообщества. Написанное приложение можно легко привязать к любому сайту, разработанного с использованием фреймворка Django, который с каждым годом становится все более и более популярным.

Планируется дальнейшее развитие проекта - добавление фото - и видео - галереи, а также, с помощью API Яндекс. translate и API Яндекс. Карты, добавить перевод всего сайта и размещения на изображении местности различных графических объектов.

Следовательно, приложение не утратит актуальности и будет в дальнейшем гораздо полезнее.

Список использованных источников


1.      Форсье Дж., Биссекс П., Чан У. Django. Разработка веб-приложений на Python. - Пер. с англ. - СПб.: Символ-Плюс, 2010. - 456 с., ил.

2.      Лутц М. Программирование на Python, том ӏ - ӏ ӏ, 4-е издание. - Пер. с англ. - СПб.: Символ-Плюс, 2011. - 992с., ил.

3.      Django - http://ru. wikipedia.org/wiki/Django <http://ru.wikipedia.org/wiki/Django>.

.        Object-Relational Mapping - http://ru. wikipedia.org/wiki/ORM.

.        Django 1.5 documentation - https: // docs. djangoproject.com/en/1.5/ <https://docs.djangoproject.com/en/1.5/>.

Приложение А


Файл manage. py

#! /usr/bin/env pythondjango. core. management import execute_managerimp:. find_module ('settings') # Assumed to be in the same directory.

except ImportError:sys. stderr. write ("Error: Can't find the file 'settings. py' in the directory containing %r. It appears you've customized things. \nYou'll have to run django-admin. py, passing it your settings module. \n" % __file__). exit (1)settings__name__ == "__main__":_manager (settings)

Файл setting. py

# - * - coding: utf-8 - *-

# Django settings for SA project.

DEBUG = True_DEBUG = DEBUG= (

# ('Your Name', 'your_email@example.com'),

)= ADMINS

"""

пароль и логин если я опять как обычно забуду

для админки

"""= {

'default': {

'ENGINE': 'django. db. backends. mysql', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.

'NAME': 'kfnexus_kurs', # Or path to database file if using sqlite3.

'USER': '045320128_kurs', # Not used with sqlite3.

'PASSWORD': '12345', # Not used with sqlite3.

'HOST': '127.0.0.1', # Set to empty string for localhost. Not used with sqlite3.

'PORT': '3306', # Set to empty string for default. Not used with sqlite3.

}

}

"""

№ настройки для локалхсота_HOST = '192.168.137.12'_PORT = '1025'

"""_USE_TLS = True_HOST = 'smtp. jino.ru'_HOST_USER = 'test@epsilon-design.ru'_HOST_PASSWORD = 'test'_PORT = 587_ZONE = 'Europe/Moscow'_CODE = 'ru-ru'_ID = 1_I18N = True_L10N = True_URLCONF = 'SA. urls'

SITE_ROOT = '/home/users1/k/kfnexus/django/kurs2/SA/'_ROOT = '/home/users1/k/kfnexus/domains/kurs2. epsilon-design.ru/' + 'media/'_URL = '/media/'_ROOT = '/home/users1/k/kfnexus/domains/kurs2. epsilon-design.ru/' + 'static/'_URL = '/static/'_MEDIA_PREFIX = '/admin/'_DIRS = ()_FINDERS = (

'django. contrib. staticfiles. finders. FileSystemFinder',

'django. contrib. staticfiles. finders. AppDirectoriesFinder',

)_KEY = '%jh+z=pal8) *6=m3@=-e ( (p66nhy2ej (yc! ^g4n8qgo*z) _$d-'_CONTEXT_PROCESSORS = (

"django. contrib. auth. context_processors. auth",

"django. core. context_processors. request",

"django. core. context_processors. i18n",

'django. contrib. messages. context_processors. messages',

'django. core. context_processors. debug',

'django. core. context_processors. media',

'django. core. context_processors. static',

)_CLASSES = (

'django. middleware. csrf. CsrfViewMiddleware',

'django. middleware.common.commonMiddleware',

'django. contrib. sessions. middleware. SessionMiddleware',

'django. contrib. auth. middleware. AuthenticationMiddleware',

'django. contrib. messages. middleware. MessageMiddleware',

'django. middleware. doc. XViewMiddleware',

'django. middleware. locale. LocaleMiddleware',

)_DIRS = (_ROOT + 'teamplates',

)_APPS = (

'SA. filebrowser',

'django. contrib. auth',

'django. contrib. contenttypes',

'django. contrib. sessions',

'django. contrib. sites',

'django. contrib. messages',

'django. contrib. staticfiles',

'django. contrib. admin',

'django. contrib.comments',

'registration',

# курсовая:

'SA. user_profile',

'SA. rialto',

'SA. blog',

'SA. kurs',

'SA. friends'

)= {

'version': 1,'disable_existing_loggers': False,

'handlers': {

'mail_admins': {

'level': 'ERROR',

'class': 'django. utils. log. AdminEmailHandler'

}

},

'loggers': {

'django. request': {

'handlers': ['mail_admins'],

'level': 'ERROR',

'propagate': True,

},

}

}_noop = lambda s: s_LANGUAGES = (

('ru', gettext_noop ('Russian')),

('en-us', gettext_noop ('US English')),

)= list (PAGE_LANGUAGES)= languages_BACKEND = "locmem: // /? max_entries=5000"_USE_SITE_ID = True_ID = 1

'plugins': "autolink,lists,spellchecker,pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions, iespell, inlinepopups, insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template",

'theme': "advanced",

'theme_advanced_buttons1': "save,newdocument,|,bold, italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,styleselect,formatselect,fontselect,fontsizeselect",

'theme_advanced_buttons2': "cut,copy,paste,pastetext,pasteword,|,search,replace,|,bullist,numlist,|,outdent, indent,blockquote,|,undo,redo,|,link,unlink,anchor, image,cleanup,help,code,|, insertdate, inserttime,preview,|,forecolor,backcolor",

'theme_advanced_buttons3': "tablecontrols,|,hr,removeformat,visualaid,|,sub,sup,|,charmap,emotions, iespell,media,advhr,|,print,|,ltr,rtl,|,fullscreen",

'theme_advanced_buttons4': "insertlayer,moveforward,movebackward,absolute,|,styleprops,spellchecker,|,cite,abbr,acronym,del, ins,attribs,|,visualchars,nonbreaking,template,blockquote,pagebreak,|, insertfile, insertimage",

'theme_advanced_toolbar_location': "top",

'theme_advanced_toolbar_align': "left",

'theme_advanced_statusbar_location': "bottom",

'theme_advanced_resizing': True,

'custom_undo_redo_levels': 10,"relative_urls": False,

}_FILEBROWSER = True_SPELLCHECKER = True_COMPRESSOR = False

# заставляем базу данных этого хостинга (sweb.ru) работать с правильной кодировкой

"""django. db import connection, transaction= connection. cursor (). execute ("SET NAMES 'utf8' COLLATE 'utf8_general_ci'").commit_unless_managed ()

"""

#-- - Настройки для джанго рестрации - ---

ACCOUNT_ACTIVATION_DAYS = 7 # One-week activation window; you may, of course, use a different value.

AUTH_PROFILE_MODULE = 'user_profile. Message'_PROFILE_MODULE = 'user_profile. Profile'

Файл url. py

# - * - coding: utf-8 - *-django. conf. urls. defaults import patterns, include, urldjango. conf import settingsdjango. contrib import admindjango. contrib. staticfiles. urls import staticfiles_urlpatternsSA. user_profile. models import ProfileSA. user_profile. signals import *SA. user_profile. forms import RegistrationFormProfileSA. user_profile. signals import *. autodiscover ()= patterns ('',(r'^accounts/register/$', 'registration. views. register', {'backend': 'registration. backends. default. DefaultBackend', 'form_class': RegistrationFormProfile,},name='registration_register'),

(r'^accounts/', include ('registration. backends. default. urls')),

# новый файлбраузер без гарппели(r'^admin/', include (admin. site. urls)),(r'^media/ (? P<path>. *) $', 'django. views. static. serve', {'document_root': settings. MEDIA_ROOT, }),(r'^static/ (? P<path>. *) $', 'django. views. static. serve', {'document_root': settings. STATIC_ROOT, }),

(r'^person/user_settings/$', 'SA. kurs. views. user_settings'),

(r'^$', 'SA. kurs. views. my_profile'),

(r'^friends/$', 'SA. friends. views. search_person'),

(r'^friends/add/ (? P<id> [^/] +) /$', 'SA. friends. views. add_person'),

(r'^friends/del/ (? P<id> [^/] +) /$', 'SA. friends. views. del_person'),

(r'^friends/accept/ (? P<objid> [^/] +) /$', 'SA. friends. views. accept_friend'),

(r'^friends/reject/ (? P<objid> [^/] +) /$', 'SA. friends. views. reject_friend'),

(r'^all_message/$', 'SA. friends. views. all_message'),

(r'^myfriends/$', 'SA. friends. views. my_friends'),

(r'^myfriends/sendmessage/ (? P<id> [^/] +) /$', 'SA. friends. views. send_message'),

(r'^blog/new_news/$', 'SA. blog. views. new_news'),

(r'^blog/blog_all_text/ (? P<id> [^/] +) /$', 'SA. blog. views. blog_all_text'),

(r'^blog/$', 'SA. blog. views. blog_views'),

(r'^blog/ (? P<slug> [^/] +) /$', 'SA. blog. views. blog_sort'),

(r'^blog/ (? P<year> [^/] +) / (? P<month> [^/] +) /$', 'SA. blog. views. blog_sort_date'),

)

Файл wsgi. py.os, sys_env = os. path. expanduser ('~/virtualenv/MyEnv')_this = os. path. join (virtual_env, 'bin/activate_this. py')(activate_this, dict (__file__=activate_this)). path. insert (0, os. path. join (os. path. expanduser ('~'), 'django/kurs2')). environ ['DJANGO_SETTINGS_MODULE'] = 'SA. settings'django. core. handlers. wsgi= django. core. handlers. wsgi. WSGIHandler ()

Приложение В


Главный шаблон всего сайта supreme.html.

<! DOCTYPE html PUBLIC "- // W3C // DTD HTML 4.01 // EN"

"http://www.w3.org/TR/html4/strict. dtd">

{% load user_profile %}

<html xmlns="http://www.w3.org/1999/xhtml" lang="en">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title>{% block title %}{% endblock %} Chat+++</title>

<link type="text/css" href="/media/yaml/core/base. css" rel="stylesheet">

<link type="text/css" href="/media/css/styles. css" rel="stylesheet">

<script type="text/javascript" src="/media/lib/jquery-1.7.1 min. js"></script>

<script type="text/javascript" src="/media/lib/balrog. js"></script>

<meta name="telderi" content="cba1d7c2e286711d42d0a79572178226" />

</head>

<body>

<div>

</div>

<div>

<div>

<a href="/"><div>

{% if user. is_authenticated %}

<div>

<ul>

<li><a>

<li><a>

<li><a href="{% url auth_password_change %}">Сменить пароль</a></li>

</ul>

</div>

{% else %}

<div>

<form method="post" action="/accounts/login/">

<ul>

{% csrf_token %}

<li>

<input type="text">

</li>

<li>

<input type="text">

</li>

<li>

<input>

</li>

<li>

<input>

</li>

</ul>

</form>

</div>

{% endif %}

</div>

<div>

{% if user. is_authenticated %}

<div>

<ul>

<li><a href="/"><img src="/media/images/search. png"/><p>МОЯ СТРАНИЦА</p></a></li>

<li><a href="/blog/"><img src="/media/images/notes. png"/><p>НОВОСТИ</p></a></li>

<li><a href="/all_message/"><img src="/media/images/mail. png"/><p>СООБЩЕНИЯ {% if user. id|messages_count %} ({{ user. id|messages_count }}) {% endif %}</p></a>

</li>

<li><a href="/friends/"><img src="/media/images/profile. png"/><p>ДРУЗЬЯ</p></a></li>

</ul>

</div>

{% else %}

<div>

<img src="/media/images/sitesimg. png"/>

<h2>Зарегестрируйтесь прежде чем пользоваться сайтом</h2>

</div>

{% endif %}

</div>

<div>

{% block title_site_info %}

{% endblock %}

<div>

МЕСТО КУДА БУДЕТ ВЫВЕДЕН КОНТЕНТ ВСПЛЫВАЮЩИХ ОКОН

{% block main %}

{% endblock %}

</div>

<div>

<div>

{% block right %}

{% endblock %}

</div>

</div>

</div>

</div>

</body>

</html>

Файл models. py приложения user_profile.

# - * - coding: utf-8 - *-django. db import modelsdjango. contrib. auth. models import UserSA. user_profile. fields import AutoOneToOneFielddatetimeImagedatetimejsonmpttos. pathSA. settings import *Profile (models. Model):= AutoOneToOneField (User, related_name='profile', verbose_name= ('User'), primary_key=True)= models. ImageField (verbose_name=u"Иконка", upload_to=u"photos/%Y/%m/%d", help_text=u'Загрузите картинку', blank=True)= models. TextField (verbose_name=u'Дополнительные сведения', blank=True)= models. CharField (max_length=150,verbose_name=u'Логин',blank=True)_name = models. CharField (max_length=150,verbose_name=u'Фамилия',blank=True)_name = models. CharField (max_length=150,verbose_name=u'Имя',blank=True)_name = models. CharField (max_length=150,verbose_name=u'Отчество',blank=True)= models. ManyToManyField ("self", blank=True, symmetrical = False, related_name='friends_targets')_requests = models. ManyToManyField ("self", blank=True, symmetrical = False, related_name='friend_requests_targets')= models. CharField (max_length=150, verbose_name = u'ICQ', blank=True)= models. CharField (max_length=150, verbose_name=u'Skype', blank = True)= models. CharField (max_length=150, verbose_name=u'Телефон', blank = True)__unicode__ (self):str (self. user)get_thumbnail_url (self, width, height):

"""Возвращает URL уменьшенной копии фотографии""":not os. path. exists (self. thumbnail. path): return None_url = None= str (self. thumbnail)_path_to_file = "%s/%s" % (MEDIA_ROOT, photo)= self. thumbnail. path [self. thumbnail. path. rfind ("/") +1:]_to = ""_to_thumbnail_dir = "%s/thumbnails%s/%sx%s" % (MEDIA_ROOT, upload_to, str (width), str (height))not os. path. exists (path_to_thumbnail_dir): os. makedirs (path_to_thumbnail_dir)_to_thumbnail = "%s/%s" % (path_to_thumbnail_dir, filename)not os. path. exists (path_to_thumbnail)::= Image. open (self. thumbnail. path). thumbnail ( (width,height), Image. ANTIALIAS). save (path_to_thumbnail, image. format, quality=95):None"%sthumbnails/%s%sx%s/%s" % (MEDIA_URL, upload_to, str (width), str (height), filename):''get_thumbnail (self):self. get_thumbnail_url (100, "*")get_big (self):self. get_thumbnail_url (600, "*")get_min_thumbnail (self):self. get_thumbnail_url (45, "*")Message (models. Model):= models. ForeignKey (User, verbose_name=u'Получатель', related_name='recipients')= models. ForeignKey (User, verbose_name=u'Отправитель', related_name='senders')= models. DateTimeField (verbose_name=u'Дата отправки сообщения',blank=True, null=True, default = datetime. datetime. now)= models. CharField (max_length=350,verbose_name=u'Заголовок сообщения',blank=True)= models. TextField (blank=True,verbose_name=u'Сообщение')= models. BooleanField (blank=True,verbose_name=u'Сообщение отправлено')Chat (models. Model):= models. ForeignKey (User, verbose_name=u'Первый участник чата', related_name='persons1')= models. ForeignKey (User, verbose_name=u'Второй участник чата', related_name='persons2')= models. ManyToManyField (Message, verbose_name=u'Все их сообщения', blank=True, related_name='all_message')last_message (self):self. messages. latest ('date')

Файл views. py для главной страницы и страницы настроек личной информации.

# - * - coding: utf-8 - *-SA. user_profile. models import Profiledjango. views. decorators. csrf import csrf_exemptdjango. shortcuts import render_to_response, redirectdjango. template import RequestContext # нужно чтобы передавать реквест в контекст

from django. forms import ModelFormdjango. http import HttpResponse, HttpResponseRedirectdjango import formsdjango. db. models import Qdjango. contrib. auth. models import Userdatetimetime

@csrf_exemptmy_profile (request):

# выводим все данные= Nonerequest. user. is_authenticated ():= User. objects. get (pk = request. user. id)Profile. objects. get (pk=request. user. id):= Profile. objects. get (pk = request. user. id):= Profile (). user_id = vector. id. first_name = vector. first_name. last_name = vector. last_name. save ()= {'person': object}render_to_response ("kurs/my_profile.html", context, context_instance=RequestContext (request)):

# хорошо бы сделать из этой проверки декоратор, чтоб всюду её не тоскать за собойrender_to_response ("kurs/error.html", {'ErrorText': u"Вы не авторизированны"}, context_instance=RequestContext (request))

@csrf_exemptuser_settings (request):= Nonerequest. user. is_authenticated ():ProfileForm (ModelForm):Meta:= Profile= ('user', 'friends', 'friend_requests')_password = forms. CharField (max_length=150, required=False,label='Новый пароль')_password = forms. CharField (max_length=150, required=False,label='Подтвердить пароль')_id = request. user. idrequest. method == 'POST':= Profile. objects. get (pk = user_id)= ProfileForm (request. POST, request. FILES, instance = object)form. is_valid ():_password = form. cleaned_data ['new_password']_password = form. cleaned_data ['confirm_password']= User. objects. get (pk = request. user. id). set_password (new_password)new_password == '':= 'Поле (новый пароль) пусто: ':confirm_password == new_password:= 'Пароли совпадают! '. save ():= 'Пароли не совпадают! '. save ()= {'form': form, 'error': str, 'object': object}render_to_response ("kurs/user_settings.html", context, context_instance=RequestContext (request)):= ProfileForm ()= Profile. objects. get (pk = user_id)= ProfileForm (instance = object)= {'form': form, 'object': object}render_to_response ('kurs/user_settings.html', context, context_instance=RequestContext (request)):

# если не залогинен

# хорошо бы сделать из этой проверки декоратор, чтоб всюду её не тоскать за собойrender_to_response ("user_profile/error.html", {'ErrorText': u"Вы не авторизированны"})

Шаблон error.html для вывода ошибки если пользователь не зарегистрирован.

{% extends "main.html" %}

{% block main %}

<div>

<h2>Ошибка</h2>

{{ErrorText|safe}}

</div>

{% endblock %}

Шаблон my_profile.html для вывода личной информации пользователя.

{% extends "main.html" %}

{% block main %}

<div>

<form enctype="multipart/form-data">

<table>

<tr>

<td>

{% if person. thumbnail == "" %}

<img src="/media/images/default. png"/>

{% else %}

<img id="img-{{ person. thumbnail }}" src="{{ MEDIA_URL }}{{ person. thumbnail }}"/>

{% endif %}

</td>

</tr>

<tr>

<td><p>

</tr>

<tr>

<td><p>

</tr>

<tr>

<td><p>

</tr>

<tr>

<td><p>

</tr>

<tr>

<td><p>

</tr>

<tr>

<td><p>

</tr>

<tr>

<td><p>

</tr>

</table>

<u><a>

</form>

</div>

{% endblock %}

Шаблон user_settings.html для вывода страницы настроек личной информации.

{% extends "main.html" %}

{% block main %}

<div>

<h2>Профиль пользователя {{user. username}}</h2>

{% if form. thumbnail. value %}

<img id="img-{{ object. thumbnail }}" src="{{object. get_thumbnail }}"/>

{% else %}

<img src="/media/images/default. png"/>

{% endif %}

<form enctype="multipart/form-data" action="" method="post">

<p>{{form. thumbnail}}</p>

<h4>Дополнительные сведения</h4>

<p>{{form. requisites}}</p>

<h4>Контактные данные</h4>

<p>{{form. user. label}}{{form. user}}</p>

<p>{{form. first_name. label}}{{form. first_name}}</p>

<p>{{form. last_name. label}}{{form. last_name}}</p>

<p>{{form. midlle_name. label}}{{form. midlle_name}}</p>

<p>{{form. icq. label}}{{form. icq}}</p>

<p>{{form. skype. label}}{{form. skype}}</p>

<p>{{form. telephone. label}}{{form. telephone}}</p>

<p>{{form. new_password. label}}{{form. new_password}}</p>

<p>{{form. confirm_password. label}}{{form. confirm_password}}</p>

{{error}}

<input>

</form>

</div>

{% endblock %}

{% block right %}

{% endblock %}

Шаблонный тег для вывода количества новых сообщений.

# - * - coding: utf-8 - *-django. template import Librarydjango. db. models import QSA. user_profile. models import Messagedjango. contrib. auth. models import User= Library ()

@register. filtermessages_count (obj):_am = User. objects. get (pk = obj)= Message. objects. filter (recipient = i_am). filter (reader = False). count ()messages

Файл views. py обрабатывающий страницу ДРУЗЬЯ и СООБЩЕНИЯ.

# - * - coding: utf-8 - *-SA. user_profile. models import Profile, Message, Chatdjango. views. decorators. csrf import csrf_exemptdjango. template import RequestContext # нужно чтобы передавать реквест в контекст

from django. forms import ModelFormdjango. http import HttpResponse, HttpResponseRedirectdjango import formsdjango. db. models import Qdjango. shortcuts import render_to_response, redirectdjango. contrib. auth. models import Userdatetimetime

# Передача на страницу формы поиска и осуществление самого поиска.

# Вывод искомых пользователей

@csrf_exemptsearch_person (request):= Nonerequest. user. is_authenticated ():ContactForm (forms. Form):_name = forms. CharField (max_length=150, required=False)_name = forms. CharField (max_length=150, required=False)= forms. CharField (max_length=150, required=False)_name = forms. CharField (max_length=150, required=False)_user = request. user. get_profilerequest. method == 'POST':= ContactForm (request. POST)= []form. is_valid ():_name = form. cleaned_data ['last_name']_name = form. cleaned_data ['first_name']_name = form. cleaned_data ['midlle_name']= form. cleaned_data ['user']= {'last_name__icontains': last_name}. append (apply (Q, (), kargs)). append (Q (first_name__icontains = first_name)). append (Q (midlle_name__icontains = midlle_name)). append (Q (user__username__icontains = user))_result = Profile. objects. filter (*params)= {'form': form, 'search_result': search_result, 'User': current_user}render_to_response ('friends/search_person.html', context, context_instance=RequestContext (request)):= ContactForm ()= {'form': form, 'User': current_user}render_to_response ('friends/search_person.html', context, context_instance=RequestContext (request)):

# если не залогинен

# хорошо бы сделать из этой проверки декоратор, чтоб всюду её не тоскать за собойrender_to_response ("friends/error.html", {'ErrorText': u"Вы не авторизированны"})

# Прохождение по ссылке "Добавить в друзья"add_person (request, id):= Profile. objects. get (user = id)= Profile. objects. get (user = request. user. get_profile). friends. add (obj). friend_requests. add (user)HttpResponseRedirect ('/friends/')

# Прохождение по ссылке "Удалить друга"del_person (request, id):= Profile. objects. get (user = id)= Profile. objects. get (user = request. user. get_profile). friends. remove (obj)HttpResponseRedirect ('/friends/')

#Прохождение по ссылке "Принять друга"accept_friend (request, objid):= Profile. objects. get (user= request. user. get_profile)_friend = Profile. objects. get (user = objid). friends. add (obj_friend). friend_requests. remove (obj_friend)HttpResponseRedirect ('/friends/')

# Прохождение по ссылке отклонить другаreject_friend (request, objid):= Profile. objects. get (user = request. user. get_profile)_friend = Profile. objects. get (user = objid). friend_requests. remove (obj_friend)HttpResponseRedirect ('/friends/')

# Вывод всех друзей

@csrf_exemptmy_friends (request):= Nonerequest. user. is_authenticated ():= User. objects. all ()request. method == 'POST':= {'friends': friends}render_to_response ('friends/choice_friend.html', context, context_instance=RequestContext (request)):

# если не залогинен

# хорошо бы сделать из этой проверки декоратор, чтоб всюду её не тоскать за собойrender_to_response ("friends/error.html", {'ErrorText': u"Вы не авторизированны"})

# Вывод объектов моделей Chat и Message

@csrf_exemptall_message (request):= Nonerequest. user. is_authenticated ():_am = User. objects. get (pk = request. user. id)= Q (person2 = i_am)= Q (person1 = i_am)_friend = Chat. objects. filter (temp4 | temp5) #person1 = request. user. username or person2 = request. user. username)

i_am = User. objects. get (pk = request. user. id)= Message. objects. filter (recipient = i_am). filter (reader = False). count ()= all_friend

#Передаем в шаблон объект чата, что бы определить каким цветом обозначать собеседника= {'all_friend': all_friend, 'messages': messages, 'image': image}render_to_response ('friends/all_message.html', context, context_instance=RequestContext (request)):

# если не залогинен

# хорошо бы сделать из этой проверки декоратор, чтоб всюду её не тоскать за собойrender_to_response ("friends/error.html", {'ErrorText': u"Вы не авторизированны"})

# Вывод формы для отправки сообщения

@csrf_exemptsend_message (request, id):MessageForm (forms. Form):= forms. CharField (max_length=350, required=False)= forms. CharField (max_length=350, required=False, widget=forms. Textarea)

#Выбираем отправить личное сообщение, и определяем в бд, что я - покупатель, а тот кому пишу письмо - продавец

friend = User. objects. get (pk = id)_am = User. objects. get (pk = request. user. id)= Q (recipient = friend) & Q (sender = i_am)= Q (recipient = i_am) & Q (sender = friend)= temp1 | temp2= Q (person2 = i_am) & Q (person1 = friend)= Q (person1 = i_am) & Q (person2 = friend)

#Выбрали - отправить личное сообщение, и определяем в бд, что я - person1 и покупатель, а тот кому пишу письмо - person2 и продавец

if len (Chat. objects. filter (temp4 | temp5)) == 0:= Chat (). person1 = i_am. person2 = friend. save ():request. method == 'POST':_message = Message. objects. filter (temp3). order_by ('date')_obj = Chat. objects. get (temp4 | temp5)= MessageForm (request. POST)form. is_valid ():= form. cleaned_data ['title']= form. cleaned_data ['message']_message = Message ()_message. recipient = friend_message. sender = i_am_message. date = datetime. datetime. now ()_message. title = title_message. message = message

#for elem in send_message:

send_message. reader = False_message. save ()_obj. messages. add (send_message)_obj. save ()redirect ('/myfriends/sendmessage/'+ str (id) + '/'):_message = Message. objects. filter (temp3). order_by ('date') [0:: 1]= Q (person2 = i_am) & Q (person1 = friend)= Q (person1 = i_am) & Q (person2 = friend)_type = Chat. objects. filter (temp4 | temp5)= MessageForm ()

#Если чувак открыл весь чат, то это значит, что он все сообщения уже прочел

# Которые находятся в переписке => они все устанавливаются в false= Message. objects. filter (temp2)elem in send:not elem. reader:. reader=True. save ()= {'form': form, 'friend': friend, 'all_message': all_message}render_to_response ('friends/send_message.html', context, context_instance=RequestContext (request))

Шаблон error.html для тех кто не зарегестрировался.

{% extends "main.html" %}

{% block main %}

<div>

<h2>Ошибка</h2>

{{ErrorText|safe}}

</div>

{% endblock %}

Шаблон search_person.html для вывода поисковой формы и всех добавленных или тех кто хочет добавиться в друзья

{% extends "main.html" %}

{% block main %}

<div>

<h1>Поиск друзей</h1>

<form action="" method="post">

<p>

<p>

<p>

<p>

<input>

{% for obj in search_result %}

{% if User! = obj %}

<p>{{ obj. last_name }} {{obj. first_name}} {{obj. midlle_name}} {{ obj. user }}</p>

{% if obj in User. friends. all %}

<p>Уже ваш друг! </p>

{% else %}

<p><a>

{% endif %}

{% endif %}

{% endfor %}

{% if User. friends. all %}

<h2>Мои друзья: </h2>

{% for elem in User. friends. all %}

<p>{{ elem }}</p>

<p><a>

<p><a>

{% endfor %}

{% endif %}

{% if User. friend_requests. all %}

<h2>К вам хотят добавиться: </h2>

{% for obj in User. friend_requests. all %}

<p>{{ obj }}</p>

<p><a>

<p><a>

{% endfor %}

{% endif %}

</form>

</div>

{% endblock %}

Шаблон all_message.html для вывода всех сообщений

{% extends "main.html" %}

{% block main %}

<form action="" method="post">

<table>

<tr>

<td colspan="2">Сообщения</td>

</tr>

{% for elem in all_friend %}

<tr>

<td>

<a href="/myfriends/sendmessage/{% if request. user. id == elem. person1. id %}{{elem. person2. id}}{% else %}

{{elem. person1. id}}{% endif %}/">

{% if request. user. id == elem. person1. id %}

{% if elem. person2. thumbnail == "" %}

<img src="/media/images/default. png"/>

{% else %}

<img id="img-{{ elem. person2. get_min_thumbnail }}" src="{{ elem. person2. get_min_thumbnail }}"/>

{% endif %}

{% else %}

{% if elem. person1. thumbnail == "" %}

<img src="/media/images/default. png"/>

{% else %}

<img id="img-{{ elem. person1. get_min_thumbnail }}" src="{{ elem. person1. get_min_thumbnail }}"/>

{% endif %}

{%endif%}

{% if user. id == elem. person2. id %}

<p>{{ elem. person1 }}</p>

{% else %}

<p>{{ elem. person2 }}</p>

{% endif %}

<div>{{ elem. last_message. date }}</div>

</a>

</td>

<td>

<a href="/myfriends/sendmessage/{% if request. user. id == elem. person1. id %}{{elem. person2. id}}{% else %}

{{elem. person1. id}}{% endif %}/">

<p>{{ elem. last_message. message|truncatechars: 80 }}</p>

</a>

</td>

</tr>

{% endfor %}

</table>

</form>

{% endblock %}

Шаблон send_message.html, для вывода всего чата и формы для отправки нового сообщения.

{% extends "main.html" %}

{% block main %}

<div>

<form action="" method="post">

<table>

<tr>

<td>История сообщений</td>

</tr>

{% for elem in all_message %}

{% if elem. reader %}

<tr bgcolor="#F8F8FF">

{% else %}

<tr bgcolor="#B2DFEE">

{% endif %}

<td>

<div>{{ elem. date }}</div>

<b>

{{ elem. sender }}

<br />

{{ elem. title }}

</b>

<p>{{ elem. message }}</p>

</td>

</tr>

{% endfor %}

</table>

<p>Кому: {{ friend. username }}</p>

<p>Заголовок: </p>

<div>{{ form. title }}</div>

<p>Сообщение: </p>

<div>{{ form. message }}</div>

<input>

</form>

</div>

{% block right %}

{% endblock %}

{% endblock %}

Модель приложения НОВОСТИ models. py

# - * - coding: utf-8 - *-django. db import modelsdjango. contrib. auth. models import UserdatetimeComment (models. Model):= models. CharField (max_length=350,verbose_name=u'Имя отправителя комментария',blank=True)= models. EmailField (max_length=350,verbose_name=u'E-mail',blank=True)= models. URLField (max_length=350,verbose_name=u'Адрес сайта',blank=True, verify_exists=False)= models. TextField (verbose_name=u'Комментарий', blank=True)Rubrics (models. Model):= models. CharField (max_length=350,verbose_name=u'Заголовок рубрики',blank=True)= models. CharField (max_length=350, verbose_name=u'Перевод на английский')__unicode__ (self):self. titleBlog (models. Model):= models. CharField (max_length=350,verbose_name=u'Заголовок новости',blank=True)_before = models. TextField (verbose_name=u'Начало новости', blank=True)_after = models. TextField (verbose_name=u'Окончание новости', blank=True)= models. DateTimeField (verbose_name=u'Дата опубликования новости',blank=True, null=True, default = datetime. datetime. now)= models. ManyToManyField (Rubrics, verbose_name=u'Рубрики', related_name='rubric', blank=True, null=True)= models. ManyToManyField (Comment, verbose_name=u'Комментарии', related_name='comments', blank=True, null=True)__unicode__ (self):self. title

Файл views. py для отображения данных на странице НОВОСТИ

# - * - coding: utf-8 - *-SA. blog. models import Blog, Rubrics, Commentdjango. views. decorators. csrf import csrf_exemptdjango. shortcuts import render_to_response, redirectdjango. template import RequestContext # нужно чтобы передавать реквест в контекст

from django. forms import ModelFormdjango. http import HttpResponse, HttpResponseRedirectdjango import formsdjango. db. models import Qdjango. contrib. auth. models import Userdatetimetime

@csrf_exemptblog_views (request):

# выводим все новости= Nonerequest. user. is_authenticated ():= Blog. objects. all ()= Rubrics. objects. all ()_obj = []obj in Blog. objects. dates ('date', 'month'):_obj. append (obj. date)= {'news': news, 'rubric': rubric, 'date_obj': date_obj }render_to_response ("blog/blog.html", context, context_instance=RequestContext (request)):

# если не залогинен

# хорошо бы сделать из этой проверки декоратор, чтоб всюду её не тоскать за собойrender_to_response ("user_profile/error.html", {'ErrorText': u"Вы не авторизированны"})

@csrf_exemptnew_news (request):

# выводим все новости= Nonerequest. user. is_authenticated ():BlogForm (forms. Form):= forms. CharField (max_length=150, required=False)_before = forms. CharField (max_length=350, required=False, widget=forms. Textarea)_after = forms. CharField (max_length=350, required=False, widget=forms. Textarea)request. method == 'POST':= BlogForm (request. POST)form. is_valid ():= form. cleaned_data ['title']_before = form. cleaned_data ['text_before']_after = form. cleaned_data ['text_after']= Blog (). title = title. text_before = text_before. text_after = text_after. date = datetime. datetime. now ()

#for elem in send_message:

new. save ()redirect ('/blog/'):= BlogForm ()= {'form': form}render_to_response ('blog/new_news.html', context, context_instance=RequestContext (request)):

# если не залогинен

# хорошо бы сделать из этой проверки декоратор, чтоб всюду её не тоскать за собойrender_to_response ("user_profile/error.html", {'ErrorText': u"Вы не авторизированны"})

@csrf_exemptblog_sort (request, slug):= Blog. objects. filter (rubrics__slug=slug)= Rubrics. objects. all ()_obj = []obj in Blog. objects. dates ('date', 'month'):_obj. append (obj. date)= {'news': news, 'rubric': rubric, 'date_obj': date_obj}render_to_response ("blog/blog.html", context, context_instance=RequestContext (request))

@csrf_exemptblog_sort_date (request, year, month):= Blog. objects. filter (date__year=year). filter (date__month=month)= Rubrics. objects. all ()_obj = []obj in Blog. objects. dates ('date', 'month'):_obj. append (obj. date)= {'news': news, 'rubric': rubric, 'date_obj': date_obj}render_to_response ("blog/blog.html", context, context_instance=RequestContext (request))

@csrf_exemptblog_all_text (request, id):= Nonerequest. user. is_authenticated ():CommentForm (forms. Form):_user = forms. CharField (max_length=150, required=False, initial = request. user. username)= forms. EmailField (max_length=150, initial=request. user. email)= forms. URLField (max_length=150, required=False, verify_exists=False)= forms. CharField (max_length=350, required=False, widget=forms. Textarea)_obj = []obj in Blog. objects. dates ('date', 'month'):_obj. append (obj. date)request. method == 'POST':

# Выберем тот объект из модели Blog, которой хотим отправить комментарий_new = Blog. objects. get (id = id)= CommentForm (request. POST)form. is_valid ():_user = form. cleaned_data ['name_user']= form. cleaned_data ['mail']= form. cleaned_data ['site']= form. cleaned_data ['comment']_comment = Comment ()_comment. name = name_user_comment. mail = mail_comment. site = site_comment.comment = comment_comment. save ()

# Добавляем в новость которую мы сейчас просматриваем новый комментарий_new.comments. add (model_comment)_new. save ()redirect ('/blog/blog_all_text/'+ str (id) + '/'):= CommentForm ()= Blog. objects. get (id = id)= Rubrics. objects. all ()= {'form': form, 'news': news, 'rubric': rubric, 'date_obj': date_obj}render_to_response ("blog/blog_all_text.html", context, context_instance=RequestContext (request)):

# если не залогинен

# хорошо бы сделать из этой проверки декоратор, чтоб всюду её не тоскать за собойrender_to_response ("user_profile/error.html", {'ErrorText': u"Вы не авторизированны"})

Шаблон blog.html для главной страницы приложения НОВОСТИ

{% extends "main.html" %}

{% block main %}

<div>

<form action="" method="post">

Архивы:

{% for obj in date_obj %}

<p><a>

{% endfor %}

<p>_________________________________________________________</p>

<table width="100%" border="0" cellspacing="0" cellpadding="4">

{% for elem in news %}

<tr align="center" bgcolor="#B2DFEE"><p> {{ elem. title }} </p></tr>

<tr align="center">

<p> </p>

<p>{{ elem. text_before }}</p></tr>

<tr align="center">

<p><a>

</tr>

<tr align="center"><p> {{ elem. date}} </p></tr>

{% endfor %}

</table>

<a>

</form>

</div>

{% endblock %}

Шаблон blog_all_text.html для просмотра всего текста новости и возможности написания комментария.

{% extends "main.html" %}

{% block main %}

<div>

<form action="" method="post">

Архивы:

{% for obj in date_obj %}

<p><a>

{% endfor %}

<p>_________________________________________________________</p>

<table width="100%" border="0" cellspacing="0" cellpadding="4">

<tr align="center" bgcolor="#B2DFEE"><p> {{ news. title }} </p></tr>

<tr align="center">

<p> {{ news. text_before }} </p>

</tr>

<tr align="center">

<p> {{ news. text_after }} </p>

</tr>

<tr align="center"><p> {{ news. date }}</p></tr>

</table>

<table>

<tr>

<td colspan="2">Комментарии</td>

</tr>

{% for obj in news.comments. all %}

<tr>

<td align="center"> {{ obj. name }}</td>

<td> {{ obj.comment }}</td>

</tr>

{% endfor %}

</table>

<table>

<tr><td> Имя: {{ form. name_user }}</td></tr>

<tr><td> Комментарии: {{ form.comment }}</td></tr>

</table>

<input type="submit" value="Отправить">

</form>

</div>

{% endblock %}

Шаблон new_news.html для опубликования новой новости.

{% extends "main.html" %}

{% block main %}

<div>

<h2>Новая запись</h2>

<img src="/media/images/default. png"/>

<form action="" method="post">

<h4>Заголовок</h4>

<p>{{form. title. label}}{{form. title}}</p>

<h4>Первая часть новости</h4>

<p>{{form. text_before. label}}{{form. text_before}}</p>

<h4>Вторая часть новости</h4>

<p>{{form. text_after. label}}{{form. text_after}}</p>

</form>

</div>

{% endblock %}

Похожие работы на - Разработка архитектуры веб-сервиса закрытой социальной сети с использованием фреймворка Django

 

Не нашел материал для своей работы?
Поможем написать качественную работу
Без плагиата!