class ProductFile(models.Model): product = models.ForeignKey(Product) name = models.CharField(max_length=120, null=True, blank=True) file = models.FileField( upload_to=upload_product_file_loc, storage=ProtectedS3Storage( ), #FileSystemStorage(location=settings.PROTECTED_ROOT) ) #filepath = models.TextField() # '/protected/path/to/the/file/myfile.mp3' free = models.BooleanField(default=False) # purchase required user_required = models.BooleanField(default=False) # user doesn't matter def __str__(self): return str(self.file.name) @property def display_name(self): og_name = get_filename(self.file.name) if self.name: return self.name return og_name def get_default_url(self): return self.product.get_absolute_url() def generate_download_url(self): bucket = getattr(settings, 'AWS_STORAGE_BUCKET_NAME') region = getattr(settings, 'S3DIRECT_REGION') access_key = getattr(settings, 'AWS_ACCESS_KEY_ID') secret_key = getattr(settings, 'AWS_SECRET_ACCESS_KEY') if not secret_key or not access_key or not bucket or not region: return "/product-not-found/" PROTECTED_DIR_NAME = getattr(settings, 'PROTECTED_DIR_NAME', 'protected') path = "{base}/{file_path}".format(base=PROTECTED_DIR_NAME, file_path=str(self.file)) aws_dl_object = AWSDownload(access_key, secret_key, bucket, region) file_url = aws_dl_object.generate_url(path, new_filename=self.display_name) return file_url def get_download_url(self): # detail view return reverse("products:download", kwargs={ "slug": self.product.slug, "pk": self.pk })
class ProductFile(models.Model): product = models.ForeignKey(Product) name = models.CharField(max_length=120, null=True, blank=True) file = models.FileField( upload_to=upload_product_file_location, storage=ProtectedS3Storage( ) # FileSystemStorage(location=settings.PROTECTED_ROOT) <- for local ) free = models.BooleanField(default=False) # purchase required user_required = models.BooleanField(default=False) # user doesn`t matter def __str__(self): return str(self.file.name) @property def display_name(self): original_name = get_filename(self.file.name) if self.name: return self.name return original_name def get_default_url(self): return self.product.get_absolute_url() def generate_download_url(self): bucket = getattr(settings, 'AWS_STORAGE_BUCKET_NAME') region = getattr(settings, 'S3DIRECT_REGION') access_key = getattr(settings, 'AWS_ACCESS_KEY_ID') secret_key = getattr(settings, 'AWS_SECRET_ACCESS_KEY') if not access_key or not secret_key or not bucket or not region: return '/product_not_found/' protected_dir_name = getattr(settings, 'PROTECTED_DIR_NAME', 'protected') path = f'{protected_dir_name}/{str(self.file)}' # works for any path inside bucket aws_dl_object = AWSDownload(access_key, secret_key, bucket, region) file_url = aws_dl_object.generate_url(path, new_filename=self.display_name) return file_url def get_download_url(self): return reverse('products:download', kwargs={ 'slug': self.product.slug, 'pk': self.pk })