from django.http import HttpResponseRedirect, HttpResponse, Http404, HttpResponsePermanentRedirect from django.shortcuts import get_object_or_404 from city.models import City from country.models import Country from theme.models import Theme, Tag from exposition.models import Exposition from conference.models import Conference from company.models import Company from article.models import Article from accounts.models import User class RedirectMixin(object): model = None def get_object_url(self, key, value): Model = self.model try: obj = Model.objects.get(old_url=value) except: obj = get_object_or_404(Model, url=value) if obj: return {key: obj.url} else: raise Http404 class CityRedirect(RedirectMixin): model = City class CountryRedirect(RedirectMixin): model = Country class ThemeRedirect(RedirectMixin): model = Theme class TagRedirect(RedirectMixin): model = Tag def get_object_url(self, key, value): obj = self._get_object(value) if not obj: if value.endswith('-expo'): value = value.replace('-expo', '') elif value.endswith('-conf'): value = value.replace('-conf', '') obj = self._get_object(value) if obj: return {key: obj.url} else: raise Http404 def _get_object(self, value): obj = None try: if self.model.objects.filter(old_url__icontains=value).exists(): obj = self.model.objects.filter(old_url__icontains=value)[0] except self.model.DoesNotExist: try: obj = self.model.objects.get(url=value) except self.model.DoesNotExist: pass return obj class CompanyRedirect(RedirectMixin): model = Company class EventRedirect(object): def get_object_url(self,key, value): try: obj = Exposition.objects.get(old_url=value) except Exposition.DoesNotExist: obj = Exposition.objects.safe_get(url=value) except Exposition.MultipleObjectsReturned: obj = Exposition.objects.filter(old_url=value)[0] if not obj: try: obj = Conference.objects.get(old_url=value) except Conference.DoesNotExist: obj = Conference.objects.safe_get(url=value) except Conference.MultipleObjectsReturned: obj = Conference.objects.filter(old=value)[0] if obj: return {'event_url': obj.url, 'event_catalog': obj.catalog} else: raise Http404 class ArticleRedirect(object): def get_object_url(self,key, value): obj = get_object_or_404(Article, id=value) return {key: obj.slug} class UserRedirect(object): def get_object_url(self,key, value): obj = get_object_or_404(User, url=value) return {key: obj.url} class PageRedirect(object): def get_object_url(self,key, value): return {key: value} class News_p(object): def get_object_url(self,key, value): obj = get_object_or_404(Article, old_id=value) return {key: obj.slug} class Country_or_City(object): def get_object_url(self,key, value): try: obj = Country.objects.get(old_url=value) except Country.DoesNotExist: try: obj = Country.objects.filter(url=value)[0] except IndexError: obj = None if not obj: try: obj = City.objects.get(old_url=value) except City.DoesNotExist: obj = get_object_or_404(City, url=value) except City.MultipleObjectsReturned: obj = City.objects.filter(old_url=value)[0] if not obj: raise Http404 if isinstance(obj, Country): result = 'country/%s'%obj.url elif isinstance(obj, City): result = 'city/%s'%obj.url return {key: result} old_params = {'city': CityRedirect, 'country': CountryRedirect, 'theme': ThemeRedirect, 'tag': TagRedirect, 'event': EventRedirect, 'company': Company, 'article': ArticleRedirect, 'user': UserRedirect, 'page': PageRedirect, 'news_p': News_p} def old_redirect(request, *args, **kwargs): redirect = kwargs.get('redirect_url') params = dict(kwargs) updates = {} for key, value in params.iteritems(): if key in old_params: redirect_obj = old_params[key]() updates.update(redirect_obj.get_object_url(key, value)) params.update(updates) redirect = redirect.format(**params) return HttpResponsePermanentRedirect(redirect) def tag_redirect(request, *args, **kwargs): redirect = kwargs.get('redirect_url') params = dict(kwargs) tag = params.get('tag', '') if tag.endswith('-conf'): redirect = redirect.replace('expo', 'conference') updates = {} for key, value in params.iteritems(): if key in old_params: redirect_obj = old_params[key]() updates.update(redirect_obj.get_object_url(key, value)) params.update(updates) redirect = redirect.format(**params) return HttpResponsePermanentRedirect(redirect) def old_profile(request): user = request.user if user.is_authenticated(): return HttpResponseRedirect('/%s/'%user.url) else: raise Http404