Finish
This commit is contained in:
0
short_url/__init__.py
Normal file
0
short_url/__init__.py
Normal file
15
short_url/admin.py
Normal file
15
short_url/admin.py
Normal file
@ -0,0 +1,15 @@
|
||||
from django.contrib import admin
|
||||
|
||||
from .models import ShortUrl
|
||||
|
||||
|
||||
@admin.register(ShortUrl)
|
||||
class ShortUrlAdmin(admin.ModelAdmin):
|
||||
list_display = (
|
||||
"id",
|
||||
"alias",
|
||||
"target",
|
||||
"created_at",
|
||||
"updated_at",
|
||||
)
|
||||
search_fields = ["alias", "target"]
|
6
short_url/apps.py
Normal file
6
short_url/apps.py
Normal file
@ -0,0 +1,6 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class ShortUrlConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'short_url'
|
25
short_url/migrations/0001_initial.py
Normal file
25
short_url/migrations/0001_initial.py
Normal file
@ -0,0 +1,25 @@
|
||||
# Generated by Django 5.1.3 on 2024-11-12 14:00
|
||||
|
||||
import url_shortener.utils
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='ShortUrl',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('alias', models.CharField(default=url_shortener.utils.generate_random_string_3, max_length=120, unique=True)),
|
||||
('target', models.URLField()),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('updated_at', models.DateTimeField(auto_now=True)),
|
||||
],
|
||||
),
|
||||
]
|
0
short_url/migrations/__init__.py
Normal file
0
short_url/migrations/__init__.py
Normal file
12
short_url/models.py
Normal file
12
short_url/models.py
Normal file
@ -0,0 +1,12 @@
|
||||
from django.db import models
|
||||
|
||||
from url_shortener.utils import generate_random_string_3
|
||||
|
||||
|
||||
class ShortUrl(models.Model):
|
||||
alias = models.CharField(
|
||||
max_length=120, unique=True, default=generate_random_string_3
|
||||
)
|
||||
target = models.URLField()
|
||||
created_at = models.DateTimeField(auto_now_add=True)
|
||||
updated_at = models.DateTimeField(auto_now=True)
|
3
short_url/tests.py
Normal file
3
short_url/tests.py
Normal file
@ -0,0 +1,3 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
14
short_url/views.py
Normal file
14
short_url/views.py
Normal file
@ -0,0 +1,14 @@
|
||||
from django.http import HttpResponse
|
||||
from django.shortcuts import get_object_or_404
|
||||
from django.views.decorators.csrf import csrf_exempt
|
||||
|
||||
from .models import ShortUrl
|
||||
|
||||
|
||||
@csrf_exempt
|
||||
def redirect_to_target(request, alias):
|
||||
short_url = get_object_or_404(ShortUrl, alias=alias)
|
||||
|
||||
response = HttpResponse(status=307)
|
||||
response['Location'] = short_url.target
|
||||
return response
|
Reference in New Issue
Block a user