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

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

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













Выпускная квалификационная работа

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


Введение

приложение корпоративный сеть

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

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

Для обеспечения защиты данных в корпоративных сетях могут использоваться различные организационно - технические методы (выделение ответственных специалистов, применение списков контроля доступа, использование VPN и т.п.). Их совокупность называется комплексной системой защиты информации.

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

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

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

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

1.1 ASmallWorld

Рисунок 1 - Корпоративная сеть ASmallWorld

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

1.2 Decayenne

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

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

Рисунок 2 - Корпоративная сеть Decayenne

1.3 Evrika

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

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

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

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

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

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

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

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

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

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

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

Основой проекта будут 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, будем использовать модуль south, для осуществления миграции базы данных, grapelli, для придания административной части красивого вида, filebrowser, для множественной загрузки файлов.

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

В качестве СУБД выбрана PostgreSQL, в связи с наличием некоторых особенностей в PostgreSQL, которые часто используются - внешние ключи, триггеры и представления. Они позволяют скрывать сложность базы данных от приложения, таким образом избегая создания сложных команд SQL. Подключение к базе данных осуществляется в папке settings (в предыдущей работе все настройки находились в одном файле settings.py).

= {

'default': {

'ENGINE': 'django.db.backends.postgresql_psycopg2',

'NAME': 'diplom',

'USER': 'postgres',

'PASSWORD':'postgres',

'HOST': '127.0.0.1',

'PORT': '5432',

}

}

Эта настройка ведется с учетом того, что в PostgreSQL мы уже создали пустую базу данных с названием diplom.

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

Класс Profile описывает структуру таблицы profile, которая ссылается на таблицу User, (сгенерированную при подключении приложения django.contrib.auth), с помощью поля user (объект класса ForeignKey, атрибут-указатель которого будет модель User).

user = models. ForeignKey (User, related_name='profile', verbose_name = ('User'), blank = True, null=True)

Так же в этой модели описаны два поля friends и friesnd_requests, которые являются объектами класса ManyToManyField (отношение многие-ко-многим) и ссылаются на свою же модель («self»), для определения, какие объекты Profile находятся в друзьях и кто хочется стать другом.

friends = models. ManyToManyField («self», blank=True, null=True, symmetrical = False, related_name='friends_targets')_requests = models. ManyToManyField («self», blank=True, null=True, symmetrical = False, related_name='friend_requests_targets')

Поле party необходимо для администратора, что бы подтверждать, что пользователь является сотрудником фирмы, обычный пользователь видеть его не будет. Если модуль django-registration, обеспечивает проверку на регистрацию существующего человека, то поле party будет рычагом администратора, для добавления в социальную сеть только сотрудников фирмы. Только после того как администратор свяжется с зарегистрированным пользователем и убедится, что тот является участником, он активирует его аккаунт через административную часть, и пользователь сможет полноценно пользоваться сайтом.

= models. BooleanField (u'Является участником сообщества', blank=True, default = False)

Поле для фотографии пользователя изменено в этой работе на FileBrowserField. Этот класс предоставляет нам возможность загружать сразу несколько файлов, выбирать какого размера они будут и многое другое (рисунок 3).

Рисунок 3 - Административная часть модели Profile

Остальные поля описывают данные пользователя: имя, фамилию, отчество и другие контактные данные.

Для того что бы хранить документы пользователя, которые он будет загружать для скачивания другим пользователям, создаем дополнительную модель FileProfile (рисунок 4).


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

Эта модель содержит поле для документа file (FileBrowserField), в которое будет сохраняться файл при добавлении его пользователем. Для того что бы поле загружало конкретно документы необходимо установить параметр ‘format’ строковым аргументом ‘document’. Тогда поле сможет сохранять форматы '.pdf', '.doc', '.rtf', '.txt', '.xls', '.csv'.

file = FileBrowseField (u «Файл», directory='uploads/files/', max_length=100, format = 'document', null=True, blank=True)

Поле user(ForeignKey), которое будет автоматически, при сохранении объекта модели, заполняться объектом модели Profile текущего пользователя.

user = models. ForeignKey (Profile, related_name='profile', verbose_name=('User'), blank=True, null=True)

Так же добавим два дополнительных поля title и date соответственно CharField и DateTimeField.

title = models. CharField (u «Заголовок», max_length=64, blank=True, null=True)= models. DateTimeField (verbose_name=u'Дата загрузки файла', blank=True, null=True, default = datetime.datetime.now)


>python manage.py schemamigration profile - initial

После этой команды в приложении создастся папка migrations, в которой сформируется файл c расширением.py, при запуске которого командой migrate, выполнятся питоновские скрипты и произойдут изменения в нашей таблице:

>python manage.py migrate profile

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

При создании остальных таблиц на основе моделей будем также использовать south.

Теперь перейдем к приложению blog, которое содержит модели Blog, Tags и Comment, описывающие соответствующие таблицы в базе данных. Модель Blog (рисунок 6) ссылается на модель Tags (рисунок 5) с помощью поля tags, которое является экземпляром класса ManyToManyField. Это означает, что каждому объекту модели Blog будет соответствовать множество объектов модели Tags.

tags = models. ManyToManyField (Tags, verbose_name=u'Теги', blank=True)

Рисунок 5 - Административная часть модели Tags

Рисунок 6 - Административная часть модели Blog

Модель Comment (рисунок 7) будет ссылаться на модель Blog с помощью связи ForeignKey.

Рисунок 7 - Административная часть модели Comment

Это необходимо для того что бы определять, какие комментарии относятся к конкретной новости. При создании этих трёх моделей также нам необходимы поля:

: zagol, author - (обьект класса CharField) заголовок новости и имя автора, image - (объект класса FileBrowseField) обложка новости, date_of_publication - (DateTimeField) дата публикации (по умолчанию устанавливается в текущую дату создания), и text - (TextField) текст новости;

Tags: name - (CharField) название тега;: author_name - (CharField) имя автора комментария, text - (TextField) текст комментария, pub_date - (DateTimeField) дата публикации комментария, admin_comment - (BooleanField) устанавливается в True администратором, если он одобряет комментарий;

Для реализации раздела СООБЩЕНИЯ создаем еще одно приложение messages. Файл models.py для этого приложения будет содержать модели Message и Chat, которые будут позволять обмениваться сообщениями между друзьями социальной сети.

Модель Message содержит два поля sender и recipient (ForeignKey), которые ссылаются на модель User, и определяют, кто из пользователей отправляет сообщение, а кто получает (рисунок 8).

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

Модель Chat служит для объединения в один объект всех объектов из модели Message, у которых получатель или отправитель соответствует полям person1 и person2, которые в свою очередь ссылаются на модель User (рисунок 9).

Рисунок 9 - Административная часть модели Сhat

Поле messages - экземпляр класса ManyToManyField и ссылается на модель Message. Т. е. один объект Chat будет ссылаться на несколько объектов модели Message.

Так же эти две модели будут содержать поля date - дата создания сообщения (DateTimeField), title - заголовок сообщения (CharField), message - текст сообщения (TextField), reader - булевское поле для установления, прочитано ли сообщение получателем или нет (BooleanField).

Все модели представлены в приложении Б в разделах соответствующих файлам models.py.

4. Class-Base-View

Весь функционал сайта был переписан, используя Class-Base-View(CBV), способ описания view с помощью классов, в связи с наличием часто используемого функционала. Чтобы не приходилось писать однообразный код, подобные view описаны прямо в коде фреймворка.

В данном проекте в качестве родительских классов используются стандартные классы ListView, DetailView, TemplateView, View, CreateView и MonthArchiveView.

Класс TemplateView позволяет отображать один шаблон, который мы указываем в атрибуте template_name. Что бы изменить передаваемый в запросе словарь с переменными, необходимо переопределить метод get_context_data и в нем добавлять в словарь context все необходимые нам аргументы.

Класс ListView обеспечивает вывод объектов в виде списка. В качестве основных аргументов используются model - для указания, из какой модели мы будем получать объекты, template_name - для явного указания какой в какой шаблон будем обрабатывать. Хотя если явно не указывать этот атрибут, Django «вычислит» его из названия объекта. В данном случае, таким «вычисленным» шаблоном будет «APP/MODEL_list.html» - часть «APP» берется из имени приложения, определяющего модель, а часть «MODEL» - это просто название модели в нижнем регистре.

Класс DetailView позволяет получать один объект, id которого будет соответствовать аргументу pk, который будет передаваться в url. Так же основным аргументом является model, которому мы будем указывать нашу модель, из которой нужно получить объект.

Класс View умеет вызывать свои фунции get(), post() и т.п. в зависимости от типа запроса, передавая request.

Класс CreateView осуществляет создание нового объекта. Основной параметр который нам необходимо указать так же является model. При генерации формы, если нам нужно что бы сохранялись какие-нибудь конкретные поля или наоборот исключить ненужные, используются атрибуты fields и exclude, которым передаются списки полей.- класс, который позволяет фильтровать только те объекты, у которых поле, отвечающее за дату создания, соответствует месяцу и году, которые передаются в url. Для этого используются атрибуты date_field и queryset.

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

Теперь приступим к реализации функционала наших страниц.

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

Для этого создадим класс ProfileView, который будет наследоваться от класса CreateView. Но в связи с тем, что на странице будет выполняться множество действий, необходимо поменять поведение view, которые описывают родительский класс. Метод get_context_data будет срабатывать при GET запросе, и выводить две формы (для создания новости и загрузки документа). Так же в каждой view мы будем устанавливать проверку:(self.request.user.is_authenticated()) and (Profile.objects.get (pk= self.request.user.id).party == True) and (not 'pk' in self.kwargs)

Этот фрагмент определят, зарегистрирован ли текущий пользователь, активирован ли он администратором и находится ли на своей странице или на странице другого пользователя.

Рисунок 10 - Главная страница пользователя

Формы для создания новости BlogForm и для загрузки файла FileForm опишем в той же директории в файле forms.py.

Первую форму укажем как стандартный атрибут родительского класса form_class. И при срабатывании POST запроса, эта форма будет обрабатываться стандартными методами CreateView. Что бы не прописывать много лишних полей в форме BlogForm, мы будем использовать класс ModelForm, который укажет что форма будет наследоваться от модели Blog, с помощью атрибута model, и атрибуту exclude укажем какие поля мы не хотим изменять.

class BlogForm (forms. ModelForm):Meta:= Blog= ('number', 'author', 'date_of_publication', 'image', 'tags')= forms. FileField (max_length=200, label= «Обложка новости», required=False)

Т. к. нам нужно что бы пользователь не видел технические поля (такие как author, date_of_publication, number, поле tags представляет собой ссылку на объекты (ManyToManyField), поле image - FileBrowserField не предоставляет функционал загрузки файла на станице сайта) то их мы будем обрабатывать и заполнять вручную во время проверки на валидность формы.

Что же касается второй формы, FileForm, то мы ее будем просто передавать в словаре context вместе с другими нужными нам переменными, и обработка будет происходить с помощью другого класса UploadView, который будет наследоваться от стандартного класса View, обеспечивающий метод post, который мы переопределим.

class FileForm (forms. ModelForm):Meta:= FileProfile= ('user', 'date', 'file')= forms. FileField (max_length=200, label= «Файл», required=False)

Хочу заметить, что при загрузке картинки новости или документа для скачивания, в формах использовалось дополнительно поле FileField. Это связано с тем, что функционал поля FielBrowserField не позволяет загружать файл на странице сайта, в отличие от стандартных Django-полей ImageField и FileField, которое описано в форме. Поэтому при выводе на шаблон (файл *.html), мы скрываем поле моделей Blog и FileProfile, а вместо них указываем дополнительное поле FileField. И уже при переопределении метода, мы из POST запроса получаем объект файла, сохраняем его по нужному нам пути и с помощью метода FileObject, который импортируется из библиотеки filebrowser, преобразуем его в объект класса FileBrowserField.

Весь код данных страниц представлен в приложении Б.

Приложение, реализующее раздел БЛОГ, описывается в папке blog нашего проекта. Основная страница этого раздела представляет собой ленту новостей, с возможностью просматривать каждую новость полностью, формой поиска по словам в тексте, заголовке и тегам новости, а также боковое меню, для фильтрации новостей по архивам (рисунок 11).

Рисунок 11 - Главная страница новостей

Функционал главной страницы новостей осуществляется с помощью класса ListView, которому передаем в качестве атрибута model модель Blog, что бы вывести все объекты данной модели.

class BlogList(ListView):= Blog_object_name = «blog»get_context_data (self, **kwargs):= super (BlogList, self).get_context_data(**kwargs)self.request.user.is_authenticated() and Profile.objects.get (pk=self.request.user.id).party==True:_obj = []obj in Blog.objects.dates ('created', 'month'):_obj.append(obj)

['archives'] = date_obj['active_main_menu']='main_blog':.template_name = «profile/error.html»

context['ErrorText'] = u "Вы не авторизированны»context

Для просмотра каждой новости создаем класс BlogDetail, а в качестве родителя класса будем указывать CreateView, что бы была возможность создавать комментарии. Атрибуту model задаем как объект модели Blog, указывая на основе какой модели, мы будем строить форму, а в атрибуте exclude укажем какие поля, мы не будем отображать на шаблоне.

model = Comment= ['article', 'author_name', 'pub_date', 'admin_comment']

И теперь, что бы при сохранении объекта наши исключенные поля тоже приобрели нужные нам значения, переопределим метод form_valid:

def form_valid (self, form):= form.save (commit=False).article = Blog.objects.get (pk=self.kwargs['pk']).author_name = self.request.user.username.pub_date = datetime.datetime.now().save()redirect (self.get_absolute_url())get_absolute_url(self):reverse («blog_detail», kwargs={«pk»: self.kwargs['pk']})

Для того что бы наши объекты модели Blog фильтровались по датам указанным в боковом меню, используем класс MonthArchiveView. Этот класс обладает атрибутом date_field, принимающего название поле типа DateTimeField в виде строки, по которому будем фильтровать объекты. При этом в url будут предаваться два параметра - month, year, которые соответствуют месяцу и году указанным в ссылке.

Заключение

В дипломной работе с помощью Class-Base-View разработано приложение, являющееся корпоративной сетью для организации ККМОО «Молодежная лига развития национальных культур Кубани», сгенерирована база данных в PostgeSQL на основе полей описанных в моделях проекта, c помощью модуля south. Приложение осуществляет обмен сообщениями, поиск, добавление и удаления других пользователей в друзья, новостной блог, с возможностью комментирования каждой статьи и личную страницу пользователя, содержащую личную ленту новостей, список документов для скачивания и контактную информацию пользователя.

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

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

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

Весь проект написан на языке Python.

Список используемой литературы

1 Django 1.5 documentation [Электронный ресурс] // Django 1.5 documentation. URL: https://docs.djangoproject.com/en/1.5/. (Дата обращения: 1.09.2013)

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

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

Бизли, Д. Python. Подробный справочник, 4-е издание/ Д. Бизли - М.: Символ-Плюс, 2010. - 326 с.

5 Object-Relational Mapping! [Электронный ресурс] // ORM. URL: http://ru.wikipedia.org/wiki/ORM. (Дата обращения: 12.03.2012).

Django [Электронный ресурс] // Django. URL: http://ru.wikipedia.org/wiki/Django. (Дата обращения: 2.09.2013)

Buter-Brod [Электронный ресурс] // Представляем корпоративную сеть asmallworld.net для богатых и знаменитых. URL: http://buter-brot.ru/Moda/prdedstavlyaem-soczialnuyu-set-asmallworldnet-dlya-bogatyx-i-znamenityx.html/. (Дата обращения: 4.04.2014).

ASmallWorld. Корпоративная сеть [Электронный ресурс] // URL: https://www.asmallworld.com/. (Дата обращения: 4.30.2014).



Приложение A

Файл manage.py

#!/usr/bin/env python

from django.core.management import execute_managerimp

:.find_module('settings') # Assumed to be in the same directory.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)


Приложение Б

Папка settings:

Файл __init.py__ (содержит все настройки Django):

# -* - encoding: utf-8 -*-os, sysdjango.contrib import messagesdjango.utils.translation import ugettext_lazy as _os.path= True_ROOT = os.path.realpath (os.path.join (os.path.dirname (__file__),»../.»))= lambda p: os.path.join (PROJECT_ROOT, p)_DEBUG = DEBUG= ADMINS_BACKEND = 'django.core.mail.backends.filebased. EmailBackend'_FILE_PATH = os.path.join (PROJECT_ROOT, '_emails')_HOST = 'localhost'_PORT = '8000'_HOST_USER = ''_HOST_PASSWORD = ''_USE_TLS = True= {

'default': {

'ENGINE': 'django.db.backends.postgresql_psycopg2',#mysql',

'NAME': 'diplom',

'USER': 'postgres',

'PASSWORD': 'postgres',

'HOST': '127.0.0.1',

'PORT': '5432',

}

}_HOSTS = []_ZONE = 'Europe/Moscow'_CODE = 'ru-ru'_ID = 1_I18N = True_L10N = True_TZ = True_PATHS = (os.path.join (PROJECT_ROOT, 'locale'),)_ROOT = os.path.join (PROJECT_ROOT, 'private/media/')_URL = '/media/'_ROOT = os.path.join (PROJECT_ROOT, 'public/static/')_URL = '/static/'_MEDIA_PREFIX = '/static/admin/'_DIRS = (.path.join (PROJECT_ROOT, 'diplom/static/'),

)

_HOST = 'www.example.com'_FINDERS = (

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

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

)_KEY = '_z (8gb-k+c^y5^1r3b02^km64ve0) bja % soa3@a23d5@*geodf'_DEBUG = DEBUG_CONTEXT_PROCESSORS = (

'django.core.context_processors.request',

'django.contrib.auth.context_processors.auth',

'django.core.context_processors.debug',

'django.core.context_processors.i18n',

'django.core.context_processors.media',

'django.core.context_processors.static',

'django.core.context_processors.tz',

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

)_LOADERS = (

'django.template.loaders.filesystem. Loader',

'django.template.loaders.app_directories. Loader',

'django.template.loaders.eggs. Loader',

)_DIRS = (.path.join (PROJECT_ROOT, 'templates/'),

)

«» «Middleware related settings.»"»_CLASSES = (

'django.middleware.common. CommonMiddleware',

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

'django.middleware.locale. LocaleMiddleware',

'django.middleware.csrf. CsrfViewMiddleware',

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

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

'django.middleware.clickjacking.XFrameOptionsMiddleware',

)_BACKENDS = (

'django.contrib.auth.backends. ModelBa_HOST = 'localhost'_PORT = 1025_HOST_USER = ''_HOST_PASSWORD = ''_USE_TLS = False_FROM_EMAIL = 'info@google.ru'= {

'version': 1,

'disable_existing_loggers': False,

'filters': {

'require_debug_false': {

'()': 'django.utils.log. RequireDebugFalse'

}

},

'handlers': {

'mail_admins': {

'level': 'ERROR',

'filters': ['require_debug_false'],

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

}

},

'loggers': {

'django.request': {

'handlers': ['mail_admins'],

'level': 'ERROR',

'propagate': True,

},

}

'guardian.backends. ObjectPermissionBackend',

)_USER_ID = -1_URLCONF = 'diplom.urls'_TAGS = {.DEBUG: 'debug',.INFO: 'alert-info',.SUCCESS: 'alert-success',.WARNING: 'alert-warning',.ERROR: 'alert-error',

}_DIRS = (.path.join (PROJECT_ROOT, 'diplom/fixtures'),

)_APPLICATION = 'diplom.wsgi.application'_APPS = (

'django.contrib.auth',

'django.contrib.contenttypes',

'django.contrib.sessions',

'django.contrib.sites',

'django.contrib.messages',

'django.contrib.staticfiles',

'django.contrib.flatpages',

'django.contrib.redirects',

'filebrowser',

'grappelli.dashboard',

'grappelli',

'guardian',

'django.contrib.admin',

'django.contrib.admindocs',

'south',

'registration',

'diplom',

'profile',

'blog',

'messages',

)installed_apps.grappelli import *installed_apps.logs import *installed_apps.filebrowser import *_SERIALIZER = 'django.contrib.sessions.serializers.JSONSerializer'_FROM_EMAIL = 'info@google.ru'= {

'version': 1,

'disable_existing_loggers': False,

'filters': {

'require_debug_false': {

'()': 'django.utils.log. RequireDebugFalse'

}

},

'handlers': {

'mail_admins': {

'level': 'ERROR',

'filters': ['require_debug_false'],

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

}

},

'loggers': {

'django.request': {

'handlers': ['mail_admins'],

'level': 'ERROR',

'propagate': True,

},

}

}_PROFILE_MODULE = 'profile. Profile'

Файл installed_apps/filebrowser.py (содержит все настройки для Filebrowser):

# -* - encoding: utf-8 -*-django.utils.translation import ugettext_lazy as __DIRECTORY = 'uploads/'_CONVERT_FILENAME = True_NORMALIZE_FILENAME = True_VERSIONS = {

'admin_thumbnail': {'verbose_name': _('Admin Thumbnail'), 'width': 60, 'height': 60, 'opts': 'crop'},

'thumbnail': {'verbose_name': _('Thumbnail (1 col)'), 'width': 60, 'height': 60, 'opts': 'crop'},

'news_logo': {'verbose_name': (u'Логотип новости'), 'width': 100, 'height': 75, 'opts': 'crop'},

'services_thumbnail': {'verbose_name': (u'Миниатюры для услуг'), 'width': 120, 'height': 90, 'opts': 'crop'},

'our_face': {'verbose_name': (u'Фотографии наших сотрудников'), 'width': 216, 'height': 278, 'opts': 'crop'},

'profile_photo': {'verbose_name': (u'Фотография пользователя'), 'width': 205, 'height': 250, 'opts': 'crop'},

'admin_list_blog': {'verbose_name':u'Изображение для списока блогов (655*215)', 'width': 655, 'height': 215, 'opts': 'crop'},

}_ADMIN_VERSIONS = ['thumbnail', 'news_logo', 'services_thumbnail', 'our_face', 'profile_photo',

'admin_list_blog'] #'small', 'medium', 'big', 'large',_ADMIN_THUMBNAIL = 'admin_thumbnail'_MAX_UPLOAD_SIZE = 60485760

_IMAGE_MAXBLOCK = 1024*1024_EXTENSIONS = {

'Folder': [''],

'Image': ['.jpg', '.jpeg', '.gif', '.png', '.tif', '.tiff'],

'Document': ['.pdf', '.doc', '.rtf', '.txt', '.xls', '.csv'],

'video': ['.mov', '.wmv', '.mpeg', '.mpg', '.avi', '.rm'],

'audio': ['.mp3', '.mp4', '.wav', '.aiff', '.midi', '.m4p']

}_SELECT_FORMATS = {

'file': ['Folder', 'Image', 'Document', 'video', 'audio'],

'image': ['Image'],

'document': ['Document'],

'media': ['video', 'audio'],

}

from django.conf.urls import patterns, include, urldjango.conf import settingsdjango.contrib import adminfilebrowser.sites import site.forms import RegistrationFormProfileprofile.views import ProfileSettingView, UploadViewregistrationos.autodiscover()= patterns ('',

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

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

(r'^accounts/profile/$', 'profile.views.profile_return'),

(r'^accounts/edit/profile/$', ProfileSettingView.as_view()),(r'^admin/filebrowser/', include (site.urls)),(r'^admin/', include (admin.site.urls)),(r'^media/(? P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}),(r'^admin/doc/', include ('django.contrib.admindocs.urls')),

(r'^upload_file/$', UploadView.as_view()),(r'^profile/', include ('profile.urls')),(r'^message/', include ('messages.urls')),(r'^blog/', include ('blog.urls')),

)

Приложение PROFILE:

Файл profile/urls.py (содержит все url-ы приложения profile):django.conf.urls import patterns, include, urlviews import ProfileView= patterns ('',(r'^$', ProfileView.as_view(), name= «profile»),(r'^friend/(? P<pk>\d+)/$', ProfileView.as_view(), name= «profile_friend»),(r'^friends/all/$', 'profile.views.search_person'),(r'^friends/add/(? P<id>[^/]+)/$', 'profile.views.add_person'),(r'^friends/del/(? P<id>[^/]+)/$', 'profile.views.del_person'),(r'^friends/accept/(? P<objid>[^/]+)/$', 'profile.views.accept_friend'),(r'^friends/reject/(? P<objid>[^/]+)/$', 'profile.views.reject_friend'),

)

Файл profile/models.py (содержит модели Profile и FileProfile приложения profile):

# -* - coding: utf-8 -*-django.db import modelsdjango.contrib.auth.models import Userdiplom.settings import *filebrowser.fields import FileBrowseFielddjango.core.urlresolvers import reversedatetime

Profile (models. Model):= models. ForeignKey (User, related_name='profile', verbose_name=('User'), blank=True, null=True)= FileBrowseField (u «Иконка», max_length=200, directory='uploads/', format='image', null=True, blank=True)= models. TextField (u'Дополнительные сведения', blank=True)= models. CharField (u'Логин', max_length=150, blank=True, null=True)_name = models. CharField (u'Фамилия', max_length=150, blank=True)_name = models. CharField (u'Имя', max_length=150, blank=True)_name = models. CharField (u'Отчество', max_length=150, blank=True)

= models. ManyToManyField («self», blank=True, null=True, symmetrical = False, related_name='friends_targets')_requests = models. ManyToManyField («self», blank=True, null=True, symmetrical = False, related_name='friend_requests_targets')

icq = models. CharField (u'ICQ', max_length=150, blank=True)= models. CharField (u'Skype', max_length=150, blank = True)= models. CharField (u'Телефон', max_length=150, blank = True)= models. BooleanField (u'Является участником сообщества', blank=True, default=False)

__unicode__(self):u' % s'% (self.user)

get_absolute_url(self):reverse («profile», kwargs={})

get_files(self):FileProfile.objects.filter (user = self)

Meta:_name = u "Пользователь»_name_plural = u "Пользователи»

FileProfile (models. Model):= models. ForeignKey (Profile, related_name='profile', verbose_name=('User'), blank=True, null=True)= models. CharField (u «Заголовок», max_length=64, blank=True, null=True)= models. DateTimeField (verbose_name=u'Дата загрузки файла', blank=True, null=True, default = datetime.datetime.now)= FileBrowseField (u «Файл», directory='uploads/files/', max_length=100, format = 'document', null=True, blank=True)

def __unicode__(self):u' % s'% (self.user)Meta:_name = u "Файл пользователя»_name_plural = u "Файлы пользователей»

Файл profile/admins.py (содержит подключение и настройки модели Profile, FileProfile для административной части):django.contrib import adminmodels import Profile, FileProfileProfileContentAdmin (admin. TabularInline):= FileProfile= ('title', 'file',)= 1FileProfileAdmin (admin. ModelAdmin):_display = ('user', 'title', 'file', 'date')= ('user', 'date')_filter = ('user', 'date')ProfileAdmin (admin. ModelAdmin):_display = ('user', 'last_name', 'first_name', 'midlle_name', 'party')= ('user',)_filter = ('user',)= [ProfileContentAdmin].site.register (Profile, ProfileAdmin).site.register (FileProfile, FileProfileAdmin)

Файл profile/forms.py (содержит модельные формы ProfileForm, BlogForm, FileForm приложения profile):

# -* - encoding: utf-8 -*-django import formsmodels import Profile, FileProfileblog.models import BlogProfileForm (forms. ModelForm):Meta:= Profile= ('user', 'thumbnail', 'login', 'friends', 'friend_requests', 'party')= forms. FileField (max_length=200, label= «Иконка», required=False)_password = forms. CharField (max_length=150, required=False, label='Новый пароль')_password = forms. CharField (max_length=150, required=False, label='Подтвердить пароль')

BlogForm (forms. ModelForm):Meta:= Blog= ('number', 'author', 'date_of_publication', 'image', 'tags')= forms. FileField (max_length=200, label= «Обложка новости», required=False)

FileForm (forms. ModelForm):Meta:= FileProfile= ('user', 'date', 'file')= forms. FileField (max_length=200, label= «Файл», required=False)

Файл profile/views.py (содержит View описывающие функционал главной страницы пользователя и страницы поиска других пользователей):

# -* - coding: utf-8 -*-django.views.generic import ListView, DetailView, TemplateView, Viewmodels import Profilemessages.models import Chat, Messagedjango.views.decorators.csrf import csrf_exemptdjango.shortcuts import render_to_responsedjango.contrib.auth.models import Userforms import ProfileForm, BlogForm, FileFormdjango.views.generic.edit import FormView, CreateView, UpdateViewdjango.template import RequestContextdjango import formsdjango.db.models import Qdjango.http import HttpResponse, HttpResponseRedirectdatetimedjango.shortcuts import render_to_response, redirectblog.models import Blog, Tagsdjango.core.urlresolvers import reversedjango.core.files.storage import default_storagedjango.core.files.base import ContentFilefilebrowser.base import FileObject

profile_return(request):render_to_response ('profile/return.html', {}, context_instance=RequestContext(request))

UploadView(View):post (self, request, *args, **kwargs):= FileForm (request.POST, request.FILES)form.is_valid:= form.save (commit=False)= default_storage.save ('uploads/files/file.pdf', ContentFile (self.request.FILES['doc'].read())).file = FileObject(path).user = Profile.objects.get (user = request.user).save()redirect (self.get_absolute_url())

get_absolute_url(self):reverse («profile», kwargs={})

ProfileView(CreateView):_name = «profile/profile.html»_class = BlogFormcreate_object_profile (self, pk):= User.objects.get (pk = pk)= Profile().user_id = vector.id.first_name = vector.first_name.last_name = vector.last_name.save()objectget_context_data (self, **kwargs):= super (ProfileView, self).get_context_data(**kwargs)(self.request.user.is_authenticated()) and (Profile.objects.get (pk=self.request.user.id).party==True) and (not 'pk' in self.kwargs):_obj = self.request.userProfile.objects.filter (pk=person_obj.id).count()==0:.create_object_profile (person_obj.id)_pk = person_obj.idself.request.user.is_authenticated() and 'pk' in self.kwargs and self.kwargs['pk']:_pk = self.kwargs['pk']Profile.objects.filter (pk=person_pk).count()==0:.create_object_profile (person_pk)_obj = User.objects.get (pk = person_pk):.template_name = «profile/error.html»['ErrorText'] = u "Вы не авторизированны»

context['blog'] = Blog.objects.filter (author=person_obj.username).order_by ('-number',)['person'] = Profile.objects.get (pk = person_pk)['form_file'] = FileFormcontextform_valid (self, form):_obj_tags=[]_tags = self.request.POST['tag'].split (', ' or ', ')elem in all_tags:_num_tags = Tags.objects.all().order_by ('-number') [0]_tag = Tags (number = max_num_tags.number+1, name = elem)_tag.save()_obj_tags.append (obj_tag)= form.save (commit=False)= Blog.objects.filter (author=self.request.user.username).order_by ('-number')blogs.count() > 0:.number = blogs[0].number+1:.number = 1.author = self.request.user.username.date_of_publication = datetime.datetime.now()= default_storage.save ('uploads/mar.jpg', ContentFile (self.request.FILES['thumbnail'].read()))_image = FileObject(path).version_generate ('admin_list_blog').image = obj_image.save()elem in arr_obj_tags:.tags.add(elem)redirect (self.get_absolute_url())get_absolute_url(self):reverse («profile», kwargs={})ProfileSettingView (TemplateView, View):_name = «user_profile/user_settings.html»_method_names = ['get', 'post']post (self, request, *args, **kwargs):= Profile.objects.get (user = request.user)= ProfileForm (request.POST, request.FILES, instance = object) # A form bound to the POST dataform.is_valid():.save (commit = False)= default_storage.save ('uploads/mar.jpg', ContentFile (request.FILES['image'].read()))_image = FileObject(path).version_generate ('profile_photo').thumbnail = obj_image.save()

# Новый пароль и Подверждение пароля_password = request.POST ['new_password']_password = request.POST ['confirm_password']

# Выбираем обьект User для изменеия пароля

index = User.objects.get (pk = request.user.id).set_password (new_password) new_password == «:

mes = 'Поле (новый пароль) пусто:'

else:confirm_password == new_password:= 'Пароли совпадают!'.save():

mes = 'Пароли не совпадают!'

form.save()redirect (reverse(«profile», kwargs={}))get_context_data (self, **kwargs):= super (ProfileSettingView, self).get_context_data(**kwargs)self.request.user.is_authenticated() and Profile.objects.get (pk=self.request.user.id).party==True:= Profile.objects.get (user = self.request.user)['object'] = object_id = self.request.user['form'] = ProfileForm (instance = object)not Profile.objects.filter (pk = user_id.id):= Profile().pk = user_id.id.user = user_id.save()context:_name = «profile/error.html»['ErrorText'] = u "Вы не авторизированны»

return context

@csrf_exemptsearch_person(request):= Nonerequest.user.is_authenticated() and Profile.objects.get (pk=request.user.id).party==True: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}:= 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 ('/profile/friends/all/')del_person (request, id):= Profile.objects.get (user = id)= Profile.objects.get (user = request.user.get_profile).friends.remove(obj)HttpResponseRedirect ('/profile/friends/all/')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 ('/profile/friends/all/')reject_friend (request, objid):= Profile.objects.get (user = request.user.get_profile)_friend = Profile.objects.get (user = objid).friend_requests.remove (obj_friend)HttpResponseRedirect ('/profile/friends/all/')

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

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

# хорошо бы сделать из этой проверки декоратор, чтоб всюду её не тоскать за собой

return render_to_response («friends/error.html», {'ErrorText': u» Вы не авторизированны»})

Приложение BLOG:

Файл urls.py для приложения blog:

from django.conf.urls import patterns, include, url.views import BlogList, ArticleMonthArchiveView, BlogDetail, FilterTagsView, BlogSearchView= patterns ('',(r'^list/$', BlogList.as_view(), name='blog_list'),(r'^(? P<year>\d{4})/(? P<month>\d+)/$',.as_view (month_format=' % m'),= «archive_month_numeric»),(r'^detail/(? P<pk>\d+)/$', BlogDetail.as_view(), name='blog_detail'),(r'^filter/tag/(? P<pk>\d+)/', FilterTagsView.as_view(), name='filter_tags'),(r'^search/$', BlogSearchView.as_view(), name='blog_search'),

)

Файл models.py для приложения blog:

# -* - coding: utf-8 -*-django.db import modelsdjango.contrib.auth.models import Userfilebrowser.fields import FileBrowseFieldmodel_utils.fields import SplitFieldmodel_utils.models import TimeStampedModeldatetimedjango.db.models import permalinkdjango.core.urlresolvers import reverse

Tags (models. Model):= models. IntegerField (u'Порядковый номер', blank=True, null=True)= models. CharField (u'Название тега', max_length=500)__unicode__(self):u' % s'% (self.name)Meta:_name = u "Тег»_name_plural = u "Теги»Blog (models. Model):= models. IntegerField (u «Порядкоый номер», blank=True, null=True)= models. CharField (u «Заголовок», max_length=64, blank=True, null=True)= models. CharField (u «Автор», max_length=200, blank=True)= FileBrowseField (u «Фото», max_length=200, directory='images/blog/', format='image', null=True, blank=True)_of_publication = models. DateTimeField (verbose_name=u'Дата публикации новости', blank=True, null=True, default = datetime.datetime.now)= SplitField (u'Текст', blank=True)= models. ManyToManyField (Tags, verbose_name=u'Теги', blank=True)__unicode__(self):u' % s'% (self.zagol,)Meta:_name = u "Блог»_name_plural = u "Блог»Comment (models. Model):=models. ForeignKey (Blog, verbose_name=u'От какого блога', related_name='link_blog', blank=True, null=True)_name=models. CharField (u «Автор», max_length=120, blank=True)=models. TextField (u'Комментарий', blank=True)_date=models. DateTimeField (u'Дата публикации', default = datetime.datetime.now, blank=True)_comment=models. BooleanField (u'Допущена администратором', default=False, blank=True)__unicode__(self):self.author_namecount_comment(self):Comment.objects.filter (article=self.article).count()Meta:_name = u "Комментарий»_name_plural = u "Комментарии»=['pub_date',]

Файл admin.py для приложения blog:

# -* - encoding: utf-8 -*-django.contrib import admin.models import Blog, Comment, TagsBlogAdmin (admin. ModelAdmin):_display = ('number', 'zagol',)_display_links = ('number', 'zagol',)_filter = ()_fields = ()= ('number',)_hierarchy='date_of_publication'TagsAdmin (admin. ModelAdmin):_display = ('number', 'name',)_display_links = ('number', 'name',)_filter = ()_fields = ()= ('name',)

CommentAdmin (admin. ModelAdmin):_display=('pub_date', 'author_name',)_fields=('text',)_filter=('author_name',)_hierarchy='pub_date'

.site.register (Blog, BlogAdmin).site.register (Tags, TagsAdmin).site.register (Comment, CommentAdmin)

Файл forms.py для приложения blog:

# -* - coding: utf-8 -*-django import formsregistration.forms import RegistrationFormUniqueEmaildjango.core.mail import send_mail.models import Blog

RegistrationFormProfile(RegistrationFormUniqueEmail):= forms. CharField (label = 'Работа')

BlogForm (forms. Form):= forms. CharField (max_length=150)= forms. EmailField()= forms. CharField (widget=forms. Textarea)send_email (self, subject, message, from_email, recipient_list=['viktori2000@qip.ru'], fail_silently=False):send_mail (subject, message, from_email, recipient_list, fail_silently)

Файл views.py для приложения blog:

# -* - coding: utf-8 -*-django.views.generic import ListView, DetailView, TemplateView.models import Blog, Tags, Commentdjango.contrib.auth.models import Userdjango.views.generic.edit import FormView, CreateView, UpdateViewdjango.forms import ModelFormdjango import formsdjango.db.models import Qdjango.contrib.auth.models import Userdatetime.forms import BlogFormdjango.views.generic.edit import CreateViewdjango.views.generic.dates import MonthArchiveViewprofile.models import Profiledjango.shortcuts import redirectdjango.core.urlresolvers import reverseCreateNews(CreateView):= Blog= ['number', 'zagol', 'author', 'image', 'date_of_publication', 'text', 'tags']get_context_data (self, **kwargs):self.request.user.is_authenticated() and Profile.objects.get (pk=self.request.user.id).party==True:= super (CreateNews, self).get_context_data(**kwargs)['object'] = Profile.objects.get (pk = self.request.user.id)context

class BlogList(ListView):= Blog_object_name = «blog»

get_context_data (self, **kwargs):= super (BlogList, self).get_context_data(**kwargs)self.request.user.is_authenticated() and Profile.objects.get (pk=self.request.user.id).party==True:_obj = []obj in Blog.objects.dates ('created', 'month'):_obj.append(obj)['archives'] = date_obj['active_main_menu']='main_blog':.template_name = «profile/error.html»['ErrorText'] = u "Вы не авторизированны»

return context

FilterTagsView(DetailView):= Blog_name = «blog/blog_list.html»= Blog.objects.all()get_context_data (self, **kwargs):= super (FilterTagsView, self).get_context_data(**kwargs)self.request.user.is_authenticated() and Profile.objects.get (pk=self.request.user.id).party==True:_obj = []obj in Blog.objects.dates ('created', 'month'):_obj.append(obj)= super (FilterTagsView, self).get_object()['blog'] = Blog.objects.filter (tags__pk = object.pk)['archives'] = date_obj['active_main_menu']='main_blog'context

BlogSearchView(ListView):_name = 'blog/blog_list.html'= Blogget_context_data (self, **kwargs):= super (BlogSearchView, self).get_context_data(**kwargs)self.request.user.is_authenticated() and Profile.objects.get (pk=self.request.user.id).party==True:_obj = []obj in Blog.objects.dates ('created', 'month'):_obj.append(obj)['archives'] = date_obj['active_main_menu']='main_blog'_word = self.request.GET ['search_box'].lower()= [].append (Blog.objects.filter (Q(zagol__icontains = search_word)))['blog']=Blog.objects.filter (Q(zagol__icontains = search_word)|Q (author__icontains = search_word)|Q (text__icontains = search_word))context

ArticleMonthArchiveView(MonthArchiveView):= Blog.objects.all()_field = «created»_object_list = True_future = Trueget_context_data (self, **kwargs):self.request.user.is_authenticated() and Profile.objects.get (pk=self.request.user.id).party==True:= super (ArticleMonthArchiveView, self).get_context_data(**kwargs)_obj = []obj in Blog.objects.dates ('created', 'month'):_obj.append(obj)['archives'] = date_obj['active_main_menu']='main_blog'context

BlogDetail(CreateView):_name = «blog/blog_detail.html»= Comment= ['article', 'author_name', 'pub_date', 'admin_comment']get_context_data (self, **kwargs):self.request.user.is_authenticated() and Profile.objects.get (pk=self.request.user.id).party==True:= super (BlogDetail, self).get_context_data(**kwargs)_obj = []obj in Blog.objects.dates ('created', 'month'):_obj.append(obj)['blog'] = Blog.objects.get (pk = self.kwargs['pk'])['archives'] = date_obj['active_main_menu'] = 'main_blog'['comments'] = Comment.objects.filter (article = context['blog'], admin_comment=True)contextform_valid (self, form):= form.save (commit=False).article = Blog.objects.get (pk=self.kwargs['pk']).author_name = self.request.user.username.pub_date = datetime.datetime.now().save()redirect (self.get_absolute_url())get_absolute_url(self):reverse («blog_detail», kwargs={«pk»: self.kwargs['pk']})

Файл urls.py для приложения message:

from django.conf.urls import patterns, include, url= patterns ('',(r'^$', 'messages.views.all_message'),(r'^sendmessage/(? P<id>[^/]+)/$', 'messages.views.send_message'),

)

Файл admin.py для приложения message:

from django.contrib import admin.models import Message, ChatMessageAdmin (admin. ModelAdmin):_display = ('recipient', 'sender', 'date', 'title')= ('recipient', 'sender')_filter = ('recipient', 'sender').site.register (Message, MessageAdmin)

ChatAdmin (admin. ModelAdmin):_display = ('person1', 'person2')= ('person1', 'person2')_filter = ('person1', 'person2').site.register (Chat, ChatAdmin)

Файл views.py для приложения message:

# -* - coding: utf-8 -*-.models import Message, Chatprofile.models import Profiledjango.views.decorators.csrf import csrf_exemptdjango.template import RequestContext # нужно чтобы передавать реквест в контекст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_exemptall_message(request):= Nonerequest.user.is_authenticated() and Profile.objects.get (pk=request.user.id).party==True:_am = User.objects.get (pk = request.user.id)= Q (person2 = i_am)= Q (person1 = i_am)_friend = Chat.objects.filter (temp4 | temp5)_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)= 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)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_message.reader = False_message.save()_obj.messages.add (send_message)_obj.save()redirect ('/message/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()= 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))

Приложение В

ККМОО «Молодежная лига развития национальных культур Кубани»

, г. Краснодар, ул. Красноармейская 53.

ИНН: 2310023918

КПП: 231001001

Счет №407038108000000000019

Банк: АО «Юг-Инвест банк», г. Краснодар

БИК 040349966

Счет №: 30101810600000000966

Код по ОКОНХ 98400

Код по ОКПО 39744165

Приложение №1 к договору № ________ от «__» ______ 2012 г.

Техническое задание для создания программной и визуальной части сайта:

. Разработка дизайна для графической части сайта.

. Разработка логотипа в векторном формате.

. Создание программного обеспечения на языке программирования Python, в среде Django.

. Создание социального раздела для общения между участниками «Клубов интернациональной дружбы».

.

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

 

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