mirror of
https://github.com/pinry/pinry.git
synced 2025-11-14 17:05:50 +01:00
45 lines
1.4 KiB
Python
45 lines
1.4 KiB
Python
from django import forms
|
|
|
|
from .models import Pin
|
|
|
|
|
|
class PinForm(forms.ModelForm):
|
|
url = forms.CharField(required=False)
|
|
image = forms.ImageField(label='or Upload', required=False)
|
|
|
|
_errors = {
|
|
'not_image': 'Requested URL is not an image file. Only images are currently supported.',
|
|
'pinned': 'URL has already been pinned!',
|
|
'protocol': 'Currently only support HTTP and HTTPS protocols, please be sure you include this in the URL.',
|
|
'nothing': 'Need either a URL or Upload',
|
|
}
|
|
|
|
class Meta:
|
|
model = Pin
|
|
fields = ['url', 'image', 'description', 'tags']
|
|
|
|
def clean(self):
|
|
cleaned_data = super(PinForm, self).clean()
|
|
|
|
url = cleaned_data.get('url')
|
|
image = cleaned_data.get('image')
|
|
|
|
if url:
|
|
image_file_types = ['png', 'gif', 'jpeg', 'jpg']
|
|
if not url.split('.')[-1].lower() in image_file_types:
|
|
raise forms.ValidationError(self._errors['not_image'])
|
|
protocol = url.split(':')[0]
|
|
if protocol not in ['http', 'https']:
|
|
raise forms.ValidationError(self._errors['protocol'])
|
|
try:
|
|
Pin.objects.get(url=url)
|
|
raise forms.ValidationError(self._errors['pinned'])
|
|
except Pin.DoesNotExist:
|
|
pass
|
|
elif image:
|
|
pass
|
|
else:
|
|
raise forms.ValidationError(self._errors['nothing'])
|
|
|
|
return cleaned_data
|