Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: added modal to save most used snippets and pre-fill the code editor #10

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,4 @@ eggs/
.cache
.env
pip-log.txt
demo/db.sqlite3
14 changes: 14 additions & 0 deletions django_admin_shell/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
"""Admin for django_admin_shell."""

from django.contrib import admin

from .models import SavedSnippets


class SavedSnippetsAdmin(admin.ModelAdmin):
"""Admin for SavedSnippets."""

list_display = ('name', 'code')
search_fields = ('name', 'code')

admin.site.register(SavedSnippets, SavedSnippetsAdmin)
27 changes: 27 additions & 0 deletions django_admin_shell/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Generated by Django 3.2.25 on 2024-04-26 12:36

from django.db import migrations, models


class Migration(migrations.Migration):

initial = True

dependencies = [
]

operations = [
migrations.CreateModel(
name='SavedSnippets',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=32)),
('code', models.TextField()),
('created_at', models.DateTimeField(auto_now_add=True)),
],
options={
'verbose_name': 'Saved Snippet',
'verbose_name_plural': 'Saved Snippets',
},
),
]
23 changes: 23 additions & 0 deletions django_admin_shell/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
"""Models for django_admin_shell."""

from django.db import models


class SavedSnippets(models.Model):
"""Models to contain saved snipets."""

name = models.CharField(max_length=32)
code = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)

objects = models.Manager()

class Meta:
"""Meta class for SavedSnippets."""

verbose_name = "Saved Snippet"
verbose_name_plural = "Saved Snippets"

def __str__(self):
"""Return name of saved snippet."""
return self.name
5 changes: 5 additions & 0 deletions django_admin_shell/static/django_admin_shell/css/shell.css
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,11 @@ a.btn {
color: #fff;
}

#code_container:hover {
cursor: pointer;
filter: brightness(95%);
}

#output_container {
width : 100%;
height: 200px;
Expand Down
4 changes: 4 additions & 0 deletions django_admin_shell/static/django_admin_shell/js/shell.js
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,10 @@ $(document).ready(function(){

set_height();

$('#saved_snippet').on('change', function(e){
$shell.val(e.target.value);
});

// ----------
// Keys:
// Ctrl + Enter = execute code
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

33 changes: 30 additions & 3 deletions django_admin_shell/templates/django_admin_shell/shell.html
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,14 @@ <h5> Django version : {{django_version}} </h5>
</div>
</div>

<script>
function save_snippet(code) {
var encoded = encodeURIComponent(code);
var url = document.location.origin + "/admin/admin_shell/savedsnippets/add/?code=" + encoded;
window.open(url, '_blank');
}
</script>

<div id="output_container">

{% if auto_import %}
Expand All @@ -34,7 +42,11 @@ <h5> Django version : {{django_version}} </h5>

{% for result in output reversed %}
<div class="output">
<div class="code"><pre>{{ result.code }}</pre></div>
<div
class="code"
id="code_container"
ondblclick="save_snippet('{{ result.code|escapejs }}')"
><pre>{{ result.code }}</pre></div>
<div class="out"><pre class="{{ result.status }}">{{ result.out }}</pre></div>
</div>
{% endfor %}
Expand All @@ -45,6 +57,20 @@ <h5> Django version : {{django_version}} </h5>

<form id="shell_form" class="form form-horizontal" method="post" action=".">
{% csrf_token %}

{% if saved_snippets %}
<div class="form-group" style="margin-top: 10px;margin-bottom: 0px;">
<div class="col-xs-12">
<select class="form-control" name="snippet" id="saved_snippet">
<option value="">Select saved snippet...</option>
{% for snippet in saved_snippets %}
<option value="{{ snippet.code }}">{{ snippet.name }}</option>
{% endfor %}
</select>
</div>
</div>
{% endif %}

{% if form.non_field_errors %}
<div class="alert alert-danger">
{{ form.non_field_errors }}
Expand All @@ -57,7 +83,7 @@ <h5> Django version : {{django_version}} </h5>
{{ form.code.errors }}
{% endif %}
</div>

<button id="run_code" type="submit" class="btn btn-success btn-block">
<span class="glyphicon glyphicon-play-circle"></span>
Run code (ctrl + enter)
Expand All @@ -76,7 +102,8 @@ <h5> Django version : {{django_version}} </h5>
<div class="col-xs-6 text-info">
<span class="glyphicon glyphicon-info-sign"></span> Ctrl + Enter : Run code<br/>
<span class="glyphicon glyphicon-info-sign"></span> Ctrl + Up/Down : Load code from history<br/>
<span class="glyphicon glyphicon-info-sign"></span> Tab : Indent = 4 spaces
<span class="glyphicon glyphicon-info-sign"></span> Tab : Indent = 4 spaces<br/>
<span class="glyphicon glyphicon-info-sign"></span> Double click : Save code snippet
</div>
</div>

Expand Down
3 changes: 3 additions & 0 deletions django_admin_shell/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
)
from django.conf import settings

from django_admin_shell.models import SavedSnippets

try:
# Only for python 2
from StringIO import StringIO
Expand Down Expand Up @@ -250,4 +252,5 @@ def get_context_data(self, **kwargs):
ctx['python_version'] = get_py_version()
ctx['django_version'] = get_dj_version()
ctx['auto_import'] = str(self.runner.importer)
ctx['saved_snippets'] = SavedSnippets.objects.all()
return ctx