def requestToken(request): ''' takes { username: string, email: string } returns { errors: { username: '******' email: 'Unknown Email' } username: user } ''' data = json.loads(request.POST['data']) user = None if 'username' in data: try: user = User.objects.get(username__iexact=data['username']) except User.DoesNotExist: user = None elif 'email' in data: try: user = User.objects.get(email__iexact=data['email']) except User.DoesNotExist: user = None if user: while True: code = ox.toAZ( random.randint(ox.fromAZ('AAAAAAAAAAAAAAAA'), ox.fromAZ('AAAAAAAAAAAAAAAAA'))) if models.UserProfile.objects.filter(reset_code=code).count() == 0: break user_profile = user.get_profile() user_profile.reset_code = code user_profile.save() template = loader.get_template('password_reset_email.txt') context = RequestContext( request, { 'code': code, 'sitename': settings.SITENAME, 'footer': settings.CONFIG['site']['email']['footer'], 'url': request.build_absolute_uri('/'), }) message = template.render(context) subject = '%s - Reset Password' % settings.SITENAME user.email_user(subject, message) response = json_response({'username': user.username}, text='password reset email sent') else: response = json_response({'errors': {}}) if 'username' in data: response['data']['errors']['username'] = '******' elif 'email' in data: response['data']['errors']['email'] = 'Unknown Email' else: response = json_response(status=400, text='invalid data') return render_to_json_response(response)
def editNews(request): ''' takes { id: string, title: string, text: string, date: string } returns { id: string ... } ''' response = json_response({}) data = json.loads(request.POST['data']) n = get_object_or_404_json(models.News, id=ox.fromAZ(data['id'])) if n.editable(request.user): for key in ('title', 'text', 'date'): if key in data: setattr(n, key, data[key]) n.save() response['data'] = n.json() else: response = json_response(status=403, text='permission denied') return render_to_json_response(response)
def editClip(request): ''' takes { id: string, in: float, out: float } returns { } ''' response = json_response() data = json.loads(request.POST['data']) clip = get_object_or_404_json(models.Clip, pk=ox.fromAZ(data['id'])) valid = True if clip.edit.editable(request.user): for key in ('in', 'out'): if key in data: if clip.annotation: clip.start = clip.annotation.start clip.end = clip.annotation.end clip.item = clip.annotation.item clip.annotation = None setattr(clip, {'in': 'start', 'out': 'end'}.get(key), float(data[key])) if not clip.annotation: duration = clip.item.sort.duration if clip.start >= clip.end or clip.start >= duration or clip.end > duration: response = json_response(status=500, text='invalid in/out') valid = False if valid: clip.save() response['data'] = clip.json(user=request.user) else: response = json_response(status=403, text='permission denied') return render_to_json_response(response)
def getNews(request): ''' takes { id: string } returns { id: string, ... } if not id is passed, return all news items takes {} returns { items: [object] } ''' data = json.loads(request.POST['data']) response = json_response() if 'id' in data: news = get_object_or_404_json(models.News, id=ox.fromAZ(data['id'])) response['data'] = news.json() else: qs = models.News.objects.all().order_by('-date') response['data']['items'] = [p.json() for p in qs] return render_to_json_response(response)
def editNews(request): ''' takes { id: string, title: string, text: string, date: string } returns { id: string ... } ''' response = json_response({}) data = json.loads(request.POST['data']) n = get_object_or_404_json(models.News, id=ox.fromAZ(data['id'])) if n.editable(request.user): for key in ('title', 'text', 'date'): if key in data: setattr(n, key, data[key]) n.save() response['data'] = n.json() else: response = json_response(status=403, text='permission denied') return render_to_json_response(response)
def getNews(request): ''' takes { id: string } returns { id: string, ... } if not id is passed, return all news items takes {} returns { items: [object] } ''' data = json.loads(request.POST['data']) response = json_response() if 'id' in data: news = get_object_or_404_json(models.News, id=ox.fromAZ(data['id'])) response['data'] = news.json() else: qs = models.News.objects.all().order_by('-date') response['data']['items'] = [p.json() for p in qs] return render_to_json_response(response)
def removeLogs(request): ''' takes { ids: [string] } returns {} ''' data = json.loads(request.POST['data']) models.Log.objects.filter(id__in=[ox.fromAZ(i) for i in data['ids']]).delete() response = json_response() return render_to_json_response(response)
def set_public_id(self): if self.id: public_id = Annotation.objects.filter(item=self.item, id__lt=self.id).count() + 1 if public_id > 1: previous = Annotation.objects.filter(item=self.item, id__lt=self.id).order_by('-id')[0] if not previous.public_id: previous.set_public_id() public_id = ox.fromAZ(previous.public_id.split('/')[-1]) + 1 self.public_id = "%s/%s" % (self.item.itemId, ox.toAZ(public_id)) Annotation.objects.filter(id=self.id).update(public_id=self.public_id)
def editEvent(request): ''' takes { id: string, name: string, start: string, end: string } returns { id: string, ... } ''' data = json.loads(request.POST['data']) event = get_object_or_404_json(models.Event, pk=ox.fromAZ(data['id'])) if event.editable(request.user): conflict = False conflict_names = [] names = [data.get('name', event.name)] + data.get( 'alternativeNames', []) for name in names: if models.Event.objects.filter( defined=True, name_find__icontains=u'|%s|' % name).exclude(id=event.id).count() != 0: conflict = True conflict_names.append(name) if not conflict: models.Event.objects.filter(defined=False, name__in=names).delete() for key in ('name', 'start', 'startTime', 'end', 'endTime', 'duration', 'durationTime', 'type', 'alternativeNames'): if key in data: value = data[key] if isinstance(value, basestring): value = ox.escape_html(value) if key == 'alternativeNames': value = tuple([ox.escape_html(v) for v in value]) setattr(event, key, value) if 'name' in data: event.set_name_sort(ox.escape_html(data['name'])) if 'nameSort' in data: event.set_name_sort(ox.escape_html(data['nameSort'])) event.save() if 'name' in data or 'alternativeNames' in data: event.update_matches() response = json_response(status=200, text='updated') response['data'] = event.json() else: response = json_response(status=409, text='Event name conflict') response['data']['names'] = conflict_names else: response = json_response(status=403, text='permission denied') return render_to_json_response(response)
def editUser(request): ''' takes { key: value } required key: id optional keys: username, email, level, notes returns { } ''' response = json_response() data = json.loads(request.POST['data']) user = get_object_or_404_json(User, pk=ox.fromAZ(data['id'])) profile = user.get_profile() if 'disabled' in data: user.is_active = not data['disabled'] if 'email' in data: if 'email' in data: data['email'] = ox.escape_html(data['email']) if User.objects.filter(email__iexact=data['email']).exclude( id=user.id).count() > 0: response = json_response(status=403, text='email already in use') return render_to_json_response(response) user.email = data['email'] if 'level' in data: profile.set_level(data['level']) if 'notes' in data: profile.notes = data['notes'] if 'newsletter' in data: profile.newsletter = data['newsletter'] if 'groups' in data: groups = data['groups'] if isinstance(groups, list): groups = filter(lambda g: g.strip(), groups) groups = [ox.escape_html(g) for g in groups] user.groups.exclude(name__in=groups).delete() current_groups = [g.name for g in user.groups.all()] for g in filter(lambda g: g not in current_groups, groups): group, created = Group.objects.get_or_create(name=g) user.groups.add(group) if 'username' in data: if User.objects.filter(username__iexact=data['username']).exclude( id=user.id).count() > 0: response = json_response(status=403, text='username already in use') return render_to_json_response(response) user.username = data['username'] user.save() profile.save() response['data'] = user.data.get().json() return render_to_json_response(response)
def editUser(request): ''' takes { key: value } required key: id optional keys: username, email, level, notes returns { } ''' response = json_response() data = json.loads(request.POST['data']) user = get_object_or_404_json(User, pk=ox.fromAZ(data['id'])) profile = user.get_profile() if 'disabled' in data: user.is_active = not data['disabled'] if 'email' in data: if 'email' in data: data['email'] = ox.escape_html(data['email']) if User.objects.filter(email__iexact=data['email']).exclude(id=user.id).count()>0: response = json_response(status=403, text='email already in use') return render_to_json_response(response) user.email = data['email'] if 'level' in data: profile.set_level(data['level']) if 'notes' in data: profile.notes = data['notes'] if 'newsletter' in data: profile.newsletter = data['newsletter'] if 'groups' in data: groups = data['groups'] if isinstance(groups, list): groups = filter(lambda g: g.strip(), groups) groups = [ox.escape_html(g) for g in groups] user.groups.exclude(name__in=groups).delete() current_groups = [g.name for g in user.groups.all()] for g in filter(lambda g: g not in current_groups, groups): group, created = Group.objects.get_or_create(name=g) user.groups.add(group) if 'username' in data: if User.objects.filter( username__iexact=data['username']).exclude(id=user.id).count()>0: response = json_response(status=403, text='username already in use') return render_to_json_response(response) user.username = data['username'] user.save() profile.save() response['data'] = user.data.get().json() return render_to_json_response(response)
def editEvent(request): ''' takes { id: string, name: string, start: string, end: string } returns { id: string, ... } ''' data = json.loads(request.POST['data']) event = get_object_or_404_json(models.Event, pk=ox.fromAZ(data['id'])) if event.editable(request.user): conflict = False conflict_names = [] names = [data.get('name', event.name)] + data.get('alternativeNames', []) for name in names: if models.Event.objects.filter(defined=True, name_find__icontains=u'|%s|'%name).exclude(id=event.id).count() != 0: conflict = True conflict_names.append(name) if not conflict: models.Event.objects.filter(defined=False, name__in=names).delete() for key in ('name', 'start', 'startTime', 'end', 'endTime', 'duration', 'durationTime', 'type', 'alternativeNames'): if key in data: value = data[key] if isinstance(value, basestring): value = ox.escape_html(value) if key == 'alternativeNames': value = tuple([ox.escape_html(v) for v in value]) setattr(event, key, value) if 'name' in data: event.set_name_sort(ox.escape_html(data['name'])) if 'nameSort' in data: event.set_name_sort(ox.escape_html(data['nameSort'])) event.save() if 'name' in data or 'alternativeNames' in data: event.update_matches() response = json_response(status=200, text='updated') response['data'] = event.json() else: response = json_response(status=409, text='Event name conflict') response['data']['names'] = conflict_names else: response = json_response(status=403, text='permission denied') return render_to_json_response(response)
def removeEvent(request): ''' remove Event with given id takes { id: event id } returns {} ''' data = json.loads(request.POST['data']) event = get_object_or_404_json(models.Event, pk=ox.fromAZ(data['id'])) if event.editable(request.user): event.delete() response = json_response(status=200, text='removed') else: response = json_response(status=403, text='permission denied') return render_to_json_response(response)
def removeEvent(request): ''' remove Event with given id takes { id: event id } returns {} ''' data = json.loads(request.POST['data']) event = get_object_or_404_json(models.Event, pk=ox.fromAZ(data['id'])) if event.editable(request.user): event.delete() response = json_response(status=200, text='removed') else: response = json_response(status=403, text='permission denied') return render_to_json_response(response)
def removeNews(request): ''' takes { ids: [] } returns {} ''' data = json.loads(request.POST['data']) response = json_response({}) news = get_object_or_404_json(models.News, id=ox.fromAZ(data['id'])) if news.editable(request.user): news.delete() response = json_response(status=200, text='news removed') else: response = json_response(status=403, text='permission denied') return render_to_json_response(response)
def removeNews(request): ''' takes { ids: [] } returns {} ''' data = json.loads(request.POST['data']) response = json_response({}) news = get_object_or_404_json(models.News, id=ox.fromAZ(data['id'])) if news.editable(request.user): news.delete() response = json_response(status=200, text='news removed') else: response = json_response(status=403, text='permission denied') return render_to_json_response(response)
def removePlace(request): ''' takes { id: string, } returns {} ''' data = json.loads(request.POST['data']) if isinstance(data, dict): data = data['id'] place = get_object_or_404_json(models.Place, pk=ox.fromAZ(data)) if place.editable(request.user): place.delete() response = json_response(status=200, text='deleted') else: response = json_response(status=403, text='permission denied') return render_to_json_response(response)
def editTitle(request): ''' takes { id: string sorttitle: string } can contain any of the allowed keys for title returns { id: string } ''' data = json.loads(request.POST['data']) title = get_object_or_404_json(models.Title, pk=ox.fromAZ(data['id'])) response = json_response() if 'sorttitle' in data: title.sorttitle = data['sorttitle'] title.sorttitle = unicodedata.normalize('NFKD', title.sorttitle) title.edited = True title.save() response['data'] = title.json() return render_to_json_response(response)
def editName(request): ''' takes { id: id, sortname: string } returns { id: string, name: string ... } ''' data = json.loads(request.POST['data']) person = get_object_or_404_json(models.Person, pk=ox.fromAZ(data['id'])) response = json_response() if 'sortname' in data: person.sortname = data['sortname'] person.edited = True person.save() tasks.update_file_paths.delay(person.id) response['data'] = person.json() return render_to_json_response(response)
def editName(request): ''' takes { id: id, sortname: string } returns { id: string, name: string ... } ''' data = json.loads(request.POST['data']) person = get_object_or_404_json(models.Person, pk=ox.fromAZ(data['id'])) response = json_response() if 'sortname' in data: person.sortname = data['sortname'] person.edited = True person.save() tasks.update_file_paths.delay(person.id) response['data'] = person.json() return render_to_json_response(response)
def editPlace(request): ''' takes { id: string, name: string north: int } returns { names: [] } ''' data = json.loads(request.POST['data']) place = get_object_or_404_json(models.Place, pk=ox.fromAZ(data['id'])) names = data.get('name', []) if isinstance(names, basestring): names = [names] names = [ox.escape_html(n) for n in names] alternative_names = [ox.escape_html(n) for n in data.get('alternativeNames', [])] alternative_names = filter(lambda n: n.strip(), alternative_names) if place.editable(request.user): conflict = False conflict_names = [] conflict_geoname = '' if alternative_names: data['alternativeNames'] = alternative_names for name in names + alternative_names: name = ox.decode_html(name) if models.Place.objects.filter(defined=True, name_find__icontains=u'|%s|'%name).exclude(id=place.id).count() != 0: conflict = True conflict_names.append(name) ''' if 'geoname' in data: if models.Place.objects.filter(defined=True, geoname=data['geoname']).exclude(id=place.id).count() != 0: conflict = True conflict_geoname = data['geoname'] ''' if not conflict: models.Place.objects.filter(defined=False, name__in=names+alternative_names).delete() for key in data: if key != 'id': value = data[key] if isinstance(value, basestring): value = ox.escape_html(value) if isinstance(value, list): value = tuple(value) setattr(place, key, value) place.save() if 'name' in data or 'alternativeNames' in data: place.update_matches() response = json_response(place.json()) else: response = json_response(status=409, text='%s exists'%(conflict_names and 'Name' or 'Geoname')) response['data']['names'] = conflict_names if conflict_geoname: response['data']['geoname'] = conflict_geoname else: response = json_response(status=403, text='permission denied') return render_to_json_response(response)
def get(cls, id): return cls.objects.get(pk=ox.fromAZ(id))
def decode_id(id): try: id = ox.fromAZ(id) except: id = 0 return id
def requestToken(request): ''' takes { username: string, email: string } returns { errors: { username: '******' email: 'Unknown Email' } username: user } ''' data = json.loads(request.POST['data']) user = None if 'username' in data: try: user = User.objects.get(username__iexact=data['username']) except User.DoesNotExist: user = None elif 'email' in data: try: user = User.objects.get(email__iexact=data['email']) except User.DoesNotExist: user = None if user: while True: code = ox.toAZ(random.randint(ox.fromAZ('AAAAAAAAAAAAAAAA'), ox.fromAZ('AAAAAAAAAAAAAAAAA'))) if models.UserProfile.objects.filter(reset_code=code).count() == 0: break user_profile = user.get_profile() user_profile.reset_code = code user_profile.save() template = loader.get_template('password_reset_email.txt') context = RequestContext(request, { 'code': code, 'sitename': settings.SITENAME, 'footer': settings.CONFIG['site']['email']['footer'], 'url': request.build_absolute_uri('/'), }) message = template.render(context) subject = '%s - Reset Password' % settings.SITENAME user.email_user(subject, message) response = json_response({ 'username': user.username }, text='password reset email sent') else: response = json_response({ 'errors': { } }) if 'username' in data: response['data']['errors']['username'] = '******' elif 'email' in data: response['data']['errors']['email'] = 'Unknown Email' else: response = json_response(status=400, text='invalid data') return render_to_json_response(response)