diff --git a/NOTICE b/NOTICE
index 020536bd..160b1dcb 100644
--- a/NOTICE
+++ b/NOTICE
@@ -4,8 +4,11 @@ All Rights Reserved.
Licensed under the LinkedIn Learning Exercise File License (the "License").
See LICENSE in the project root for license information.
-ATTRIBUTIONS:
-[PLEASE PROVIDE ATTRIBUTIONS OR DELETE THIS AND THE ABOVE LINE “ATTRIBUTIONS”]
+Django
+https://github.com/django/django
+Copyright (c) Django Software Foundation and individual contributors
+License: BSD-3-Clause
+https://opensource.org/licenses/BSD-3-Clause
Please note, this project may automatically load third party code from external
repositories (for example, NPM modules, Composer packages, or other dependencies).
@@ -13,3 +16,32 @@ If so, such third party code may be subject to other license terms than as set
forth above. In addition, such third party code may also depend on and load
multiple tiers of dependencies. Please review the applicable licenses of the
additional dependencies.
+
+=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+
+BSD-3-Clause
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ 3. Neither the name of Django nor the names of its contributors may be used
+ to endorse or promote products derived from this software without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/README.md b/README.md
index 422e0932..3f34ac8e 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,10 @@
-# COURSENAME
-This is the repository for the LinkedIn Learning course `course-name`. The full course is available from [LinkedIn Learning][lil-course-url].
+# Django Essential Training
+This is the repository for the LinkedIn Learning course Django Essential Training. The full course is available from [LinkedIn Learning][lil-course-url].
-![course-name-alt-text][lil-thumbnail-url]
+![Django Essential Training][lil-thumbnail-url]
+
+Django is a robust and powerful framework with a lot of moving parts. Although starting a new project can be quite easy, there is a lot to uncover. This course teaches fundamentals, such as what a framework is, what an HTTP request is, and how Django replies to HTTP requests. Software developer and podcaster Leticia Portella walks you through each step of building a working system that can create, edit, and list books per user with an authentication system. Topics include getting started, creating users and data, ORMs, creating a dynamic template, Django class-based files and static views, and so much more!
-_See the readme file in the main branch for updated instructions and information._
## Instructions
This repository has branches for each of the videos in the course. You can use the branch pop up menu in github to switch to a specific branch and take a look at the course at that stage, or you can add `/tree/BRANCH_NAME` to the URL to go to the branch you want to access.
@@ -29,8 +30,15 @@ To resolve this issue:
3. [Course-specific instructions]
-[0]: # (Replace these placeholder URLs with actual course URLs)
+### Instructor
+
+Leticia Portella
+
+
+
+
-[lil-course-url]: https://www.linkedin.com/learning/
-[lil-thumbnail-url]: http://
+Check out my other courses on [LinkedIn Learning](https://www.linkedin.com/learning/instructors/leticia-portella).
+[lil-course-url]: https://www.linkedin.com/learning/django-essential-training
+[lil-thumbnail-url]: https://cdn.lynda.com/course/2894047/2894047-1632244073199-16x9.jpg
diff --git a/home/__init__.py b/home/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/home/admin.py b/home/admin.py
new file mode 100644
index 00000000..8c38f3f3
--- /dev/null
+++ b/home/admin.py
@@ -0,0 +1,3 @@
+from django.contrib import admin
+
+# Register your models here.
diff --git a/home/apps.py b/home/apps.py
new file mode 100644
index 00000000..e5ea0afa
--- /dev/null
+++ b/home/apps.py
@@ -0,0 +1,6 @@
+from django.apps import AppConfig
+
+
+class HomeConfig(AppConfig):
+ default_auto_field = 'django.db.models.BigAutoField'
+ name = 'home'
diff --git a/home/migrations/__init__.py b/home/migrations/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/home/models.py b/home/models.py
new file mode 100644
index 00000000..71a83623
--- /dev/null
+++ b/home/models.py
@@ -0,0 +1,3 @@
+from django.db import models
+
+# Create your models here.
diff --git a/home/templates/home/authorized.html b/home/templates/home/authorized.html
new file mode 100644
index 00000000..87e073b0
--- /dev/null
+++ b/home/templates/home/authorized.html
@@ -0,0 +1,5 @@
+{% extends "base.html" %}
+
+{% block content %}
+
You are in a restricted area
+{% endblock %}
\ No newline at end of file
diff --git a/home/templates/home/login.html b/home/templates/home/login.html
new file mode 100644
index 00000000..51cd1f2d
--- /dev/null
+++ b/home/templates/home/login.html
@@ -0,0 +1,9 @@
+{% extends 'base.html' %}
+{% block content %}
+
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/home/templates/home/logout.html b/home/templates/home/logout.html
new file mode 100644
index 00000000..b22b4110
--- /dev/null
+++ b/home/templates/home/logout.html
@@ -0,0 +1,6 @@
+{% extends 'base.html' %}
+{% block content %}
+
+Hope to see you soon :)
+
+{% endblock %}
\ No newline at end of file
diff --git a/home/templates/home/register.html b/home/templates/home/register.html
new file mode 100644
index 00000000..246e50e4
--- /dev/null
+++ b/home/templates/home/register.html
@@ -0,0 +1,9 @@
+{% extends 'base.html' %}
+{% block content %}
+
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/home/templates/home/welcome.html b/home/templates/home/welcome.html
new file mode 100644
index 00000000..161f5d02
--- /dev/null
+++ b/home/templates/home/welcome.html
@@ -0,0 +1,7 @@
+{% extends "base.html" %}
+
+{% block content %}
+ Welcome to SmartNotes!
+ Today is {{today}}
+ Check out these smart notes!
+{% endblock %}
\ No newline at end of file
diff --git a/home/tests.py b/home/tests.py
new file mode 100644
index 00000000..7ce503c2
--- /dev/null
+++ b/home/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/home/urls.py b/home/urls.py
new file mode 100644
index 00000000..1683cc9b
--- /dev/null
+++ b/home/urls.py
@@ -0,0 +1,10 @@
+from django.urls import path
+
+from . import views
+
+urlpatterns = [
+ path('', views.HomeView.as_view(), name='home'),
+ path('login', views.LoginInterfaceView.as_view(), name='login'),
+ path('logout', views.LogoutInterfaceView.as_view(), name='logout'),
+ path('signup', views.SignupView.as_view(), name='signup'),
+]
\ No newline at end of file
diff --git a/home/views.py b/home/views.py
new file mode 100644
index 00000000..a421b477
--- /dev/null
+++ b/home/views.py
@@ -0,0 +1,32 @@
+from datetime import datetime
+from django.views.generic import TemplateView
+from django.views.generic.edit import CreateView
+from django.contrib.auth.mixins import LoginRequiredMixin
+from django.contrib.auth.views import LoginView, LogoutView
+from django.contrib.auth.forms import UserCreationForm
+
+from django.shortcuts import redirect
+
+class SignupView(CreateView):
+ form_class = UserCreationForm
+ template_name = 'home/register.html'
+ success_url = '/smart/notes'
+
+ def get(self, request, *args, **kwargs):
+ if self.request.user.is_authenticated:
+ return redirect('notes.list')
+ return super().get(request, *args, **kwargs)
+
+class LogoutInterfaceView(LogoutView):
+ template_name = 'home/logout.html'
+
+class LoginInterfaceView(LoginView):
+ template_name = 'home/login.html'
+
+class HomeView(TemplateView):
+ template_name = 'home/welcome.html'
+ extra_context = {'today': datetime.today()}
+
+class AuthorizedView(LoginRequiredMixin, TemplateView):
+ template_name = 'home/authorized.html'
+ login_url = '/admin'
\ No newline at end of file
diff --git a/manage.py b/manage.py
new file mode 100755
index 00000000..9ce8f7a1
--- /dev/null
+++ b/manage.py
@@ -0,0 +1,22 @@
+#!/usr/bin/env python
+"""Django's command-line utility for administrative tasks."""
+import os
+import sys
+
+
+def main():
+ """Run administrative tasks."""
+ os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'smartnotes.settings')
+ try:
+ from django.core.management import execute_from_command_line
+ except ImportError as exc:
+ raise ImportError(
+ "Couldn't import Django. Are you sure it's installed and "
+ "available on your PYTHONPATH environment variable? Did you "
+ "forget to activate a virtual environment?"
+ ) from exc
+ execute_from_command_line(sys.argv)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/notes/__init__.py b/notes/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/notes/admin.py b/notes/admin.py
new file mode 100644
index 00000000..55a46a07
--- /dev/null
+++ b/notes/admin.py
@@ -0,0 +1,8 @@
+from django.contrib import admin
+
+from . import models
+
+class NotesAdmin(admin.ModelAdmin):
+ list_display = ('title',)
+
+admin.site.register(models.Notes, NotesAdmin)
\ No newline at end of file
diff --git a/notes/apps.py b/notes/apps.py
new file mode 100644
index 00000000..832dd3f7
--- /dev/null
+++ b/notes/apps.py
@@ -0,0 +1,6 @@
+from django.apps import AppConfig
+
+
+class NotesConfig(AppConfig):
+ default_auto_field = 'django.db.models.BigAutoField'
+ name = 'notes'
diff --git a/notes/forms.py b/notes/forms.py
new file mode 100644
index 00000000..fe08c072
--- /dev/null
+++ b/notes/forms.py
@@ -0,0 +1,16 @@
+from django import forms
+from django.core.exceptions import ValidationError
+
+from .models import Notes
+
+class NotesForm(forms.ModelForm):
+ class Meta:
+ model = Notes
+ fields = ('title', 'text')
+ widgets = {
+ 'title': forms.TextInput(attrs={'class': 'form-control my-5'}),
+ 'text': forms.Textarea(attrs={"class": "form-control mb-5"})
+ }
+ labels = {
+ 'text': 'Write your thoughts here:'
+ }
\ No newline at end of file
diff --git a/notes/migrations/0001_initial.py b/notes/migrations/0001_initial.py
new file mode 100644
index 00000000..73c276ed
--- /dev/null
+++ b/notes/migrations/0001_initial.py
@@ -0,0 +1,23 @@
+# Generated by Django 3.2.2 on 2021-07-18 15:28
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Notes',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('title', models.CharField(max_length=200)),
+ ('text', models.TextField()),
+ ('created', models.DateTimeField(auto_now_add=True)),
+ ],
+ ),
+ ]
diff --git a/notes/migrations/0002_notes_user.py b/notes/migrations/0002_notes_user.py
new file mode 100644
index 00000000..b12cb206
--- /dev/null
+++ b/notes/migrations/0002_notes_user.py
@@ -0,0 +1,22 @@
+# Generated by Django 3.2.2 on 2021-07-28 21:40
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ('notes', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='notes',
+ name='user',
+ field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='notes', to='auth.user'),
+ preserve_default=False,
+ ),
+ ]
diff --git a/notes/migrations/__init__.py b/notes/migrations/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/notes/models.py b/notes/models.py
new file mode 100644
index 00000000..c692c416
--- /dev/null
+++ b/notes/models.py
@@ -0,0 +1,8 @@
+from django.db import models
+from django.contrib.auth.models import User
+
+class Notes(models.Model):
+ title = models.CharField(max_length=200)
+ text = models.TextField()
+ created = models.DateTimeField(auto_now_add=True)
+ user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="notes")
\ No newline at end of file
diff --git a/notes/templates/notes/notes_delete.html b/notes/templates/notes/notes_delete.html
new file mode 100644
index 00000000..db3211e9
--- /dev/null
+++ b/notes/templates/notes/notes_delete.html
@@ -0,0 +1,11 @@
+{% extends 'base.html' %}
+
+{% block content %}
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/notes/templates/notes/notes_detail.html b/notes/templates/notes/notes_detail.html
new file mode 100644
index 00000000..3a03ad84
--- /dev/null
+++ b/notes/templates/notes/notes_detail.html
@@ -0,0 +1,12 @@
+{% extends "base.html" %}
+
+{% block content %}
+
+
{{note.title}}
+
{{note.text}}
+
+
+Back
+Edit
+Delete
+{% endblock %}
\ No newline at end of file
diff --git a/notes/templates/notes/notes_form.html b/notes/templates/notes/notes_form.html
new file mode 100644
index 00000000..6409fe4d
--- /dev/null
+++ b/notes/templates/notes/notes_form.html
@@ -0,0 +1,16 @@
+{% extends 'base.html' %}
+
+{% block content %}
+
+
+{% if form.errors %}
+
+ {{form.errors.title.as_text}}
+
+{% endif %}
+
+{% endblock %}
\ No newline at end of file
diff --git a/notes/templates/notes/notes_list.html b/notes/templates/notes/notes_list.html
new file mode 100644
index 00000000..124c2108
--- /dev/null
+++ b/notes/templates/notes/notes_list.html
@@ -0,0 +1,20 @@
+{% extends "base.html" %}
+
+{% block content %}
+ These are the notes:
+
+
+ {% for note in notes %}
+
+ {% endfor %}
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/notes/tests.py b/notes/tests.py
new file mode 100644
index 00000000..7ce503c2
--- /dev/null
+++ b/notes/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/notes/urls.py b/notes/urls.py
new file mode 100644
index 00000000..744b7d2f
--- /dev/null
+++ b/notes/urls.py
@@ -0,0 +1,11 @@
+from django.urls import path
+
+from . import views
+
+urlpatterns = [
+ path('notes', views.NotesListView.as_view(), name="notes.list"),
+ path('notes/', views.NotesDetailView.as_view(), name="notes.detail"),
+ path('notes//edit', views.NotesUpdateView.as_view(), name="notes.update"),
+ path('notes//delete', views.NotesDeleteView.as_view(), name="notes.delete"),
+ path('notes/new', views.NotesCreateView.as_view(), name="notes.new"),
+]
\ No newline at end of file
diff --git a/notes/views.py b/notes/views.py
new file mode 100644
index 00000000..13f18567
--- /dev/null
+++ b/notes/views.py
@@ -0,0 +1,46 @@
+from django.http.response import HttpResponseRedirect
+from django.views.generic import CreateView, DetailView, ListView, UpdateView
+from django.views.generic.edit import DeleteView
+from django.contrib.auth.mixins import LoginRequiredMixin
+
+from .forms import NotesForm
+from .models import Notes
+
+
+class NotesDeleteView(LoginRequiredMixin, DeleteView):
+ model = Notes
+ success_url = '/smart/notes'
+ template_name = 'notes/notes_delete.html'
+ login_url = "/login"
+
+class NotesUpdateView(LoginRequiredMixin, UpdateView):
+ model = Notes
+ success_url = '/smart/notes'
+ form_class = NotesForm
+ login_url = "/login"
+
+class NotesCreateView(LoginRequiredMixin, CreateView):
+ model = Notes
+ success_url = '/smart/notes'
+ form_class = NotesForm
+ login_url = "/login"
+
+ def form_valid(self, form):
+ self.object = form.save(commit=False)
+ self.object.user = self.request.user
+ self.object.save()
+ return HttpResponseRedirect(self.get_success_url())
+
+class NotesListView(LoginRequiredMixin, ListView):
+ model = Notes
+ context_object_name = "notes"
+ template_name = "notes/notes_list.html"
+ login_url = "/login"
+
+ def get_queryset(self):
+ return self.request.user.notes.all()
+
+class NotesDetailView(LoginRequiredMixin, DetailView):
+ model = Notes
+ context_object_name = "note"
+ login_url = "/login"
\ No newline at end of file
diff --git a/smartnotes/__init__.py b/smartnotes/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/smartnotes/asgi.py b/smartnotes/asgi.py
new file mode 100644
index 00000000..a3bb5a40
--- /dev/null
+++ b/smartnotes/asgi.py
@@ -0,0 +1,16 @@
+"""
+ASGI config for smartnotes project.
+
+It exposes the ASGI callable as a module-level variable named ``application``.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/3.2/howto/deployment/asgi/
+"""
+
+import os
+
+from django.core.asgi import get_asgi_application
+
+os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'smartnotes.settings')
+
+application = get_asgi_application()
diff --git a/smartnotes/bin/Activate.ps1 b/smartnotes/bin/Activate.ps1
new file mode 100644
index 00000000..b49d77ba
--- /dev/null
+++ b/smartnotes/bin/Activate.ps1
@@ -0,0 +1,247 @@
+<#
+.Synopsis
+Activate a Python virtual environment for the current PowerShell session.
+
+.Description
+Pushes the python executable for a virtual environment to the front of the
+$Env:PATH environment variable and sets the prompt to signify that you are
+in a Python virtual environment. Makes use of the command line switches as
+well as the `pyvenv.cfg` file values present in the virtual environment.
+
+.Parameter VenvDir
+Path to the directory that contains the virtual environment to activate. The
+default value for this is the parent of the directory that the Activate.ps1
+script is located within.
+
+.Parameter Prompt
+The prompt prefix to display when this virtual environment is activated. By
+default, this prompt is the name of the virtual environment folder (VenvDir)
+surrounded by parentheses and followed by a single space (ie. '(.venv) ').
+
+.Example
+Activate.ps1
+Activates the Python virtual environment that contains the Activate.ps1 script.
+
+.Example
+Activate.ps1 -Verbose
+Activates the Python virtual environment that contains the Activate.ps1 script,
+and shows extra information about the activation as it executes.
+
+.Example
+Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv
+Activates the Python virtual environment located in the specified location.
+
+.Example
+Activate.ps1 -Prompt "MyPython"
+Activates the Python virtual environment that contains the Activate.ps1 script,
+and prefixes the current prompt with the specified string (surrounded in
+parentheses) while the virtual environment is active.
+
+.Notes
+On Windows, it may be required to enable this Activate.ps1 script by setting the
+execution policy for the user. You can do this by issuing the following PowerShell
+command:
+
+PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
+
+For more information on Execution Policies:
+https://go.microsoft.com/fwlink/?LinkID=135170
+
+#>
+Param(
+ [Parameter(Mandatory = $false)]
+ [String]
+ $VenvDir,
+ [Parameter(Mandatory = $false)]
+ [String]
+ $Prompt
+)
+
+<# Function declarations --------------------------------------------------- #>
+
+<#
+.Synopsis
+Remove all shell session elements added by the Activate script, including the
+addition of the virtual environment's Python executable from the beginning of
+the PATH variable.
+
+.Parameter NonDestructive
+If present, do not remove this function from the global namespace for the
+session.
+
+#>
+function global:deactivate ([switch]$NonDestructive) {
+ # Revert to original values
+
+ # The prior prompt:
+ if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) {
+ Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt
+ Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT
+ }
+
+ # The prior PYTHONHOME:
+ if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) {
+ Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME
+ Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME
+ }
+
+ # The prior PATH:
+ if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) {
+ Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH
+ Remove-Item -Path Env:_OLD_VIRTUAL_PATH
+ }
+
+ # Just remove the VIRTUAL_ENV altogether:
+ if (Test-Path -Path Env:VIRTUAL_ENV) {
+ Remove-Item -Path env:VIRTUAL_ENV
+ }
+
+ # Just remove VIRTUAL_ENV_PROMPT altogether.
+ if (Test-Path -Path Env:VIRTUAL_ENV_PROMPT) {
+ Remove-Item -Path env:VIRTUAL_ENV_PROMPT
+ }
+
+ # Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether:
+ if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) {
+ Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force
+ }
+
+ # Leave deactivate function in the global namespace if requested:
+ if (-not $NonDestructive) {
+ Remove-Item -Path function:deactivate
+ }
+}
+
+<#
+.Description
+Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the
+given folder, and returns them in a map.
+
+For each line in the pyvenv.cfg file, if that line can be parsed into exactly
+two strings separated by `=` (with any amount of whitespace surrounding the =)
+then it is considered a `key = value` line. The left hand string is the key,
+the right hand is the value.
+
+If the value starts with a `'` or a `"` then the first and last character is
+stripped from the value before being captured.
+
+.Parameter ConfigDir
+Path to the directory that contains the `pyvenv.cfg` file.
+#>
+function Get-PyVenvConfig(
+ [String]
+ $ConfigDir
+) {
+ Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg"
+
+ # Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue).
+ $pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue
+
+ # An empty map will be returned if no config file is found.
+ $pyvenvConfig = @{ }
+
+ if ($pyvenvConfigPath) {
+
+ Write-Verbose "File exists, parse `key = value` lines"
+ $pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath
+
+ $pyvenvConfigContent | ForEach-Object {
+ $keyval = $PSItem -split "\s*=\s*", 2
+ if ($keyval[0] -and $keyval[1]) {
+ $val = $keyval[1]
+
+ # Remove extraneous quotations around a string value.
+ if ("'""".Contains($val.Substring(0, 1))) {
+ $val = $val.Substring(1, $val.Length - 2)
+ }
+
+ $pyvenvConfig[$keyval[0]] = $val
+ Write-Verbose "Adding Key: '$($keyval[0])'='$val'"
+ }
+ }
+ }
+ return $pyvenvConfig
+}
+
+
+<# Begin Activate script --------------------------------------------------- #>
+
+# Determine the containing directory of this script
+$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition
+$VenvExecDir = Get-Item -Path $VenvExecPath
+
+Write-Verbose "Activation script is located in path: '$VenvExecPath'"
+Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)"
+Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)"
+
+# Set values required in priority: CmdLine, ConfigFile, Default
+# First, get the location of the virtual environment, it might not be
+# VenvExecDir if specified on the command line.
+if ($VenvDir) {
+ Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values"
+}
+else {
+ Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir."
+ $VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/")
+ Write-Verbose "VenvDir=$VenvDir"
+}
+
+# Next, read the `pyvenv.cfg` file to determine any required value such
+# as `prompt`.
+$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir
+
+# Next, set the prompt from the command line, or the config file, or
+# just use the name of the virtual environment folder.
+if ($Prompt) {
+ Write-Verbose "Prompt specified as argument, using '$Prompt'"
+}
+else {
+ Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value"
+ if ($pyvenvCfg -and $pyvenvCfg['prompt']) {
+ Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'"
+ $Prompt = $pyvenvCfg['prompt'];
+ }
+ else {
+ Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virtual environment)"
+ Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'"
+ $Prompt = Split-Path -Path $venvDir -Leaf
+ }
+}
+
+Write-Verbose "Prompt = '$Prompt'"
+Write-Verbose "VenvDir='$VenvDir'"
+
+# Deactivate any currently active virtual environment, but leave the
+# deactivate function in place.
+deactivate -nondestructive
+
+# Now set the environment variable VIRTUAL_ENV, used by many tools to determine
+# that there is an activated venv.
+$env:VIRTUAL_ENV = $VenvDir
+
+if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) {
+
+ Write-Verbose "Setting prompt to '$Prompt'"
+
+ # Set the prompt to include the env name
+ # Make sure _OLD_VIRTUAL_PROMPT is global
+ function global:_OLD_VIRTUAL_PROMPT { "" }
+ Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT
+ New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt
+
+ function global:prompt {
+ Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) "
+ _OLD_VIRTUAL_PROMPT
+ }
+ $env:VIRTUAL_ENV_PROMPT = $Prompt
+}
+
+# Clear PYTHONHOME
+if (Test-Path -Path Env:PYTHONHOME) {
+ Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME
+ Remove-Item -Path Env:PYTHONHOME
+}
+
+# Add the venv to the PATH
+Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH
+$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH"
diff --git a/smartnotes/bin/activate b/smartnotes/bin/activate
new file mode 100644
index 00000000..e317ef27
--- /dev/null
+++ b/smartnotes/bin/activate
@@ -0,0 +1,69 @@
+# This file must be used with "source bin/activate" *from bash*
+# you cannot run it directly
+
+deactivate () {
+ # reset old environment variables
+ if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then
+ PATH="${_OLD_VIRTUAL_PATH:-}"
+ export PATH
+ unset _OLD_VIRTUAL_PATH
+ fi
+ if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then
+ PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}"
+ export PYTHONHOME
+ unset _OLD_VIRTUAL_PYTHONHOME
+ fi
+
+ # This should detect bash and zsh, which have a hash command that must
+ # be called to get it to forget past commands. Without forgetting
+ # past commands the $PATH changes we made may not be respected
+ if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then
+ hash -r 2> /dev/null
+ fi
+
+ if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then
+ PS1="${_OLD_VIRTUAL_PS1:-}"
+ export PS1
+ unset _OLD_VIRTUAL_PS1
+ fi
+
+ unset VIRTUAL_ENV
+ unset VIRTUAL_ENV_PROMPT
+ if [ ! "${1:-}" = "nondestructive" ] ; then
+ # Self destruct!
+ unset -f deactivate
+ fi
+}
+
+# unset irrelevant variables
+deactivate nondestructive
+
+VIRTUAL_ENV="/Users/deborahloring/django-esst-2894047/smartnotes"
+export VIRTUAL_ENV
+
+_OLD_VIRTUAL_PATH="$PATH"
+PATH="$VIRTUAL_ENV/bin:$PATH"
+export PATH
+
+# unset PYTHONHOME if set
+# this will fail if PYTHONHOME is set to the empty string (which is bad anyway)
+# could use `if (set -u; : $PYTHONHOME) ;` in bash
+if [ -n "${PYTHONHOME:-}" ] ; then
+ _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}"
+ unset PYTHONHOME
+fi
+
+if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then
+ _OLD_VIRTUAL_PS1="${PS1:-}"
+ PS1="(smartnotes) ${PS1:-}"
+ export PS1
+ VIRTUAL_ENV_PROMPT="(smartnotes) "
+ export VIRTUAL_ENV_PROMPT
+fi
+
+# This should detect bash and zsh, which have a hash command that must
+# be called to get it to forget past commands. Without forgetting
+# past commands the $PATH changes we made may not be respected
+if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then
+ hash -r 2> /dev/null
+fi
diff --git a/smartnotes/bin/activate.csh b/smartnotes/bin/activate.csh
new file mode 100644
index 00000000..a06f59fb
--- /dev/null
+++ b/smartnotes/bin/activate.csh
@@ -0,0 +1,26 @@
+# This file must be used with "source bin/activate.csh" *from csh*.
+# You cannot run it directly.
+# Created by Davide Di Blasi .
+# Ported to Python 3.3 venv by Andrew Svetlov
+
+alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; unsetenv VIRTUAL_ENV_PROMPT; test "\!:*" != "nondestructive" && unalias deactivate'
+
+# Unset irrelevant variables.
+deactivate nondestructive
+
+setenv VIRTUAL_ENV "/Users/deborahloring/django-esst-2894047/smartnotes"
+
+set _OLD_VIRTUAL_PATH="$PATH"
+setenv PATH "$VIRTUAL_ENV/bin:$PATH"
+
+
+set _OLD_VIRTUAL_PROMPT="$prompt"
+
+if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then
+ set prompt = "(smartnotes) $prompt"
+ setenv VIRTUAL_ENV_PROMPT "(smartnotes) "
+endif
+
+alias pydoc python -m pydoc
+
+rehash
diff --git a/smartnotes/bin/activate.fish b/smartnotes/bin/activate.fish
new file mode 100644
index 00000000..322b9d20
--- /dev/null
+++ b/smartnotes/bin/activate.fish
@@ -0,0 +1,69 @@
+# This file must be used with "source /bin/activate.fish" *from fish*
+# (https://fishshell.com/); you cannot run it directly.
+
+function deactivate -d "Exit virtual environment and return to normal shell environment"
+ # reset old environment variables
+ if test -n "$_OLD_VIRTUAL_PATH"
+ set -gx PATH $_OLD_VIRTUAL_PATH
+ set -e _OLD_VIRTUAL_PATH
+ end
+ if test -n "$_OLD_VIRTUAL_PYTHONHOME"
+ set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME
+ set -e _OLD_VIRTUAL_PYTHONHOME
+ end
+
+ if test -n "$_OLD_FISH_PROMPT_OVERRIDE"
+ set -e _OLD_FISH_PROMPT_OVERRIDE
+ # prevents error when using nested fish instances (Issue #93858)
+ if functions -q _old_fish_prompt
+ functions -e fish_prompt
+ functions -c _old_fish_prompt fish_prompt
+ functions -e _old_fish_prompt
+ end
+ end
+
+ set -e VIRTUAL_ENV
+ set -e VIRTUAL_ENV_PROMPT
+ if test "$argv[1]" != "nondestructive"
+ # Self-destruct!
+ functions -e deactivate
+ end
+end
+
+# Unset irrelevant variables.
+deactivate nondestructive
+
+set -gx VIRTUAL_ENV "/Users/deborahloring/django-esst-2894047/smartnotes"
+
+set -gx _OLD_VIRTUAL_PATH $PATH
+set -gx PATH "$VIRTUAL_ENV/bin" $PATH
+
+# Unset PYTHONHOME if set.
+if set -q PYTHONHOME
+ set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME
+ set -e PYTHONHOME
+end
+
+if test -z "$VIRTUAL_ENV_DISABLE_PROMPT"
+ # fish uses a function instead of an env var to generate the prompt.
+
+ # Save the current fish_prompt function as the function _old_fish_prompt.
+ functions -c fish_prompt _old_fish_prompt
+
+ # With the original prompt function renamed, we can override with our own.
+ function fish_prompt
+ # Save the return status of the last command.
+ set -l old_status $status
+
+ # Output the venv prompt; color taken from the blue of the Python logo.
+ printf "%s%s%s" (set_color 4B8BBE) "(smartnotes) " (set_color normal)
+
+ # Restore the return status of the previous command.
+ echo "exit $old_status" | .
+ # Output the original/"old" prompt.
+ _old_fish_prompt
+ end
+
+ set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV"
+ set -gx VIRTUAL_ENV_PROMPT "(smartnotes) "
+end
diff --git a/smartnotes/bin/django-admin b/smartnotes/bin/django-admin
new file mode 100755
index 00000000..61758d53
--- /dev/null
+++ b/smartnotes/bin/django-admin
@@ -0,0 +1,8 @@
+#!/Users/deborahloring/django-esst-2894047/smartnotes/bin/python3.11
+# -*- coding: utf-8 -*-
+import re
+import sys
+from django.core.management import execute_from_command_line
+if __name__ == '__main__':
+ sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
+ sys.exit(execute_from_command_line())
diff --git a/smartnotes/bin/django-admin.py b/smartnotes/bin/django-admin.py
new file mode 100755
index 00000000..409d433b
--- /dev/null
+++ b/smartnotes/bin/django-admin.py
@@ -0,0 +1,21 @@
+#!/Users/deborahloring/django-esst-2894047/smartnotes/bin/python3.11
+# When the django-admin.py deprecation ends, remove this script.
+import warnings
+
+from django.core import management
+
+try:
+ from django.utils.deprecation import RemovedInDjango40Warning
+except ImportError:
+ raise ImportError(
+ 'django-admin.py was deprecated in Django 3.1 and removed in Django '
+ '4.0. Please manually remove this script from your virtual environment '
+ 'and use django-admin instead.'
+ )
+
+if __name__ == "__main__":
+ warnings.warn(
+ 'django-admin.py is deprecated in favor of django-admin.',
+ RemovedInDjango40Warning,
+ )
+ management.execute_from_command_line()
diff --git a/smartnotes/bin/pip b/smartnotes/bin/pip
new file mode 100755
index 00000000..13f4a224
--- /dev/null
+++ b/smartnotes/bin/pip
@@ -0,0 +1,8 @@
+#!/Users/deborahloring/django-esst-2894047/smartnotes/bin/python3.11
+# -*- coding: utf-8 -*-
+import re
+import sys
+from pip._internal.cli.main import main
+if __name__ == '__main__':
+ sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
+ sys.exit(main())
diff --git a/smartnotes/bin/pip3 b/smartnotes/bin/pip3
new file mode 100755
index 00000000..13f4a224
--- /dev/null
+++ b/smartnotes/bin/pip3
@@ -0,0 +1,8 @@
+#!/Users/deborahloring/django-esst-2894047/smartnotes/bin/python3.11
+# -*- coding: utf-8 -*-
+import re
+import sys
+from pip._internal.cli.main import main
+if __name__ == '__main__':
+ sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
+ sys.exit(main())
diff --git a/smartnotes/bin/pip3.11 b/smartnotes/bin/pip3.11
new file mode 100755
index 00000000..13f4a224
--- /dev/null
+++ b/smartnotes/bin/pip3.11
@@ -0,0 +1,8 @@
+#!/Users/deborahloring/django-esst-2894047/smartnotes/bin/python3.11
+# -*- coding: utf-8 -*-
+import re
+import sys
+from pip._internal.cli.main import main
+if __name__ == '__main__':
+ sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
+ sys.exit(main())
diff --git a/smartnotes/bin/python b/smartnotes/bin/python
new file mode 120000
index 00000000..6e7f3c7d
--- /dev/null
+++ b/smartnotes/bin/python
@@ -0,0 +1 @@
+python3.11
\ No newline at end of file
diff --git a/smartnotes/bin/python3 b/smartnotes/bin/python3
new file mode 120000
index 00000000..6e7f3c7d
--- /dev/null
+++ b/smartnotes/bin/python3
@@ -0,0 +1 @@
+python3.11
\ No newline at end of file
diff --git a/smartnotes/bin/python3.11 b/smartnotes/bin/python3.11
new file mode 120000
index 00000000..2d175777
--- /dev/null
+++ b/smartnotes/bin/python3.11
@@ -0,0 +1 @@
+/Library/Frameworks/Python.framework/Versions/3.11/bin/python3.11
\ No newline at end of file
diff --git a/smartnotes/bin/sqlformat b/smartnotes/bin/sqlformat
new file mode 100755
index 00000000..4e58c73b
--- /dev/null
+++ b/smartnotes/bin/sqlformat
@@ -0,0 +1,8 @@
+#!/Users/deborahloring/django-esst-2894047/smartnotes/bin/python3.11
+# -*- coding: utf-8 -*-
+import re
+import sys
+from sqlparse.__main__ import main
+if __name__ == '__main__':
+ sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
+ sys.exit(main())
diff --git a/smartnotes/lib/python3.11/site-packages/Django-3.2.dist-info/AUTHORS b/smartnotes/lib/python3.11/site-packages/Django-3.2.dist-info/AUTHORS
new file mode 100644
index 00000000..6af620f7
--- /dev/null
+++ b/smartnotes/lib/python3.11/site-packages/Django-3.2.dist-info/AUTHORS
@@ -0,0 +1,1000 @@
+Django was originally created in late 2003 at World Online, the Web division
+of the Lawrence Journal-World newspaper in Lawrence, Kansas.
+
+Here is an inevitably incomplete list of MUCH-APPRECIATED CONTRIBUTORS --
+people who have submitted patches, reported bugs, added translations, helped
+answer newbie questions, and generally made Django that much better:
+
+ Aaron Cannon
+ Aaron Swartz
+ Aaron T. Myers
+ Abeer Upadhyay
+ Abhijeet Viswa
+ Abhinav Patil
+ Abhishek Gautam
+ Adam Allred
+ Adam Bogdał
+ Adam Donaghy
+ Adam Johnson
+ Adam Malinowski
+ Adam Vandenberg
+ Adiyat Mubarak
+ Adnan Umer
+ Adrian Holovaty
+ Adrien Lemaire
+ Afonso Fernández Nogueira
+ AgarFu
+ Ahmad Alhashemi
+ Ahmad Al-Ibrahim
+ Ahmed Eltawela
+ ajs
+ Akash Agrawal
+ Akis Kesoglou
+ Aksel Ethem
+ Akshesh Doshi
+ alang@bright-green.com
+ Alasdair Nicol
+ Albert Wang
+ Alcides Fonseca
+ Aldian Fazrihady
+ Aleksandra Sendecka
+ Aleksi Häkli
+ Alexander Dutton
+ Alexander Myodov
+ Alexandr Tatarinov
+ Alex Aktsipetrov
+ Alex Becker
+ Alex Couper
+ Alex Dedul
+ Alex Gaynor
+ Alex Hill
+ Alex Ogier
+ Alex Robbins
+ Alexey Boriskin
+ Alexey Tsivunin
+ Ali Vakilzade
+ Aljosa Mohorovic
+ Amit Chakradeo
+ Amit Ramon
+ Amit Upadhyay
+ A. Murat Eren
+ Ana Belen Sarabia
+ Ana Krivokapic
+ Andi Albrecht
+ André Ericson
+ Andrei Kulakov
+ Andreas
+ Andreas Mock
+ Andreas Pelme
+ Andrés Torres Marroquín
+ Andrew Brehaut
+ Andrew Clark
+ Andrew Durdin
+ Andrew Godwin
+ Andrew Pinkham
+ Andrews Medina
+ Andriy Sokolovskiy
+ Andy Chosak
+ Andy Dustman
+ Andy Gayton
+ andy@jadedplanet.net
+ Anssi Kääriäinen
+ ant9000@netwise.it
+ Anthony Briggs
+ Anton Samarchyan
+ Antoni Aloy
+ Antonio Cavedoni
+ Antonis Christofides
+ Antti Haapala
+ Antti Kaihola
+ Anubhav Joshi
+ Aram Dulyan
+ arien
+ Armin Ronacher
+ Aron Podrigal
+ Artem Gnilov
+ Arthur
+ Arthur Koziel
+ Arthur Rio
+ Arvis Bickovskis
+ Aryeh Leib Taurog
+ A S Alam
+ Asif Saif Uddin
+ atlithorn
+ Audrey Roy
+ av0000@mail.ru
+ Axel Haustant
+ Aymeric Augustin
+ Bahadır Kandemir
+ Baishampayan Ghose
+ Baptiste Mispelon
+ Barry Pederson
+ Bartolome Sanchez Salado
+ Barton Ip
+ Bartosz Grabski
+ Bashar Al-Abdulhadi
+ Bastian Kleineidam
+ Batiste Bieler
+ Batman
+ Batuhan Taskaya
+ Baurzhan Ismagulov
+ Ben Dean Kawamura
+ Ben Firshman
+ Ben Godfrey
+ Benjamin Wohlwend
+ Ben Khoo
+ Ben Slavin
+ Ben Sturmfels
+ Berker Peksag
+ Bernd Schlapsi
+ Bernhard Essl
+ berto
+ Bill Fenner
+ Bjørn Stabell
+ Bo Marchman
+ Bogdan Mateescu
+ Bojan Mihelac
+ Bouke Haarsma
+ Božidar Benko
+ Brad Melin
+ Brandon Chinn
+ Brant Harris
+ Brendan Hayward
+ Brendan Quinn
+ Brenton Simpson
+ Brett Cannon
+ Brett Hoerner
+ Brian Beck
+ Brian Fabian Crain
+ Brian Harring
+ Brian Helba
+ Brian Ray
+ Brian Rosner
+ Bruce Kroeze
+ Bruno Alla
+ Bruno Renié
+ brut.alll@gmail.com
+ Bryan Chow
+ Bryan Veloso
+ bthomas
+ btoll@bestweb.net
+ C8E
+ Caio Ariede
+ Calvin Spealman
+ Cameron Curry
+ Cameron Knight (ckknight)
+ Can Burak Çilingir
+ Can Sarıgöl
+ Carl Meyer
+ Carles Pina i Estany
+ Carlos Eduardo de Paula
+ Carlos Matías de la Torre
+ Carlton Gibson
+ cedric@terramater.net
+ Chad Whitman
+ ChaosKCW
+ Charlie Leifer
+ charly.wilhelm@gmail.com
+ Chason Chaffin
+ Cheng Zhang
+ Chris Adams
+ Chris Beaven
+ Chris Bennett
+ Chris Cahoon
+ Chris Chamberlin
+ Chris Jerdonek
+ Chris Jones
+ Chris Lamb
+ Chris Streeter
+ Christian Barcenas
+ Christian Metts
+ Christian Oudard
+ Christian Tanzer
+ Christoffer Sjöbergsson
+ Christophe Pettus
+ Christopher Adams
+ Christopher Babiak
+ Christopher Lenz
+ Christoph Mędrela
+ Chris Wagner
+ Chris Wesseling
+ Chris Wilson
+ Claude Paroz
+ Clint Ecker
+ colin@owlfish.com
+ Colin Wood
+ Collin Anderson
+ Collin Grady
+ Colton Hicks
+ Craig Blaszczyk
+ crankycoder@gmail.com
+ Curtis Maloney (FunkyBob)
+ dackze+django@gmail.com
+ Dagur Páll Ammendrup
+ Dane Springmeyer
+ Dan Fairs
+ Daniel Alves Barbosa de Oliveira Vaz
+ Daniel Duan
+ Daniele Procida
+ Daniel Greenfeld
+ dAniel hAhler
+ Daniel Jilg
+ Daniel Lindsley
+ Daniel Poelzleithner
+ Daniel Pyrathon
+ Daniel Roseman
+ Daniel Tao
+ Daniel Wiesmann
+ Danilo Bargen
+ Dan Johnson
+ Dan Palmer
+ Dan Poirier
+ Dan Stephenson
+ Dan Watson
+ dave@thebarproject.com
+ David Ascher
+ David Avsajanishvili
+ David Blewett
+ David Brenneman
+ David Cramer
+ David Danier
+ David Eklund
+ David Foster
+ David Gouldin
+ david@kazserve.org
+ David Krauth
+ David Larlet
+ David Reynolds
+ David Sanders
+ David Schein
+ David Tulig
+ David Wobrock
+ Davide Ceretti
+ Deep L. Sukhwani
+ Deepak Thukral
+ Denis Kuzmichyov
+ Dennis Schwertel
+ Derek Willis
+ Deric Crago
+ deric@monowerks.com
+ Deryck Hodge
+ Dimitris Glezos
+ Dirk Datzert
+ Dirk Eschler
+ Dmitri Fedortchenko
+ Dmitry Jemerov
+ dne@mayonnaise.net
+ Dolan Antenucci
+ Donald Harvey
+ Donald Stufft
+ Don Spaulding
+ Doug Beck
+ Doug Napoleone
+ dready
+ dusk@woofle.net
+ Dustyn Gibson
+ Ed Morley
+ Egidijus Macijauskas
+ eibaan@gmail.com
+ elky
+ Emmanuelle Delescolle
+ Emil Stenström
+ enlight
+ Enrico
+ Eric Boersma
+ Eric Brandwein
+ Eric Floehr
+ Eric Florenzano
+ Eric Holscher
+ Eric Moritz
+ Eric Palakovich Carr
+ Erik Karulf
+ Erik Romijn
+ eriks@win.tue.nl
+ Erwin Junge
+ Esdras Beleza
+ Espen Grindhaug
+ Étienne Beaulé
+ Eugene Lazutkin
+ Evan Grim
+ Fabrice Aneche
+ Farhaan Bukhsh
+ favo@exoweb.net
+ fdr
+ Federico Capoano
+ Felipe Lee
+ Filip Noetzel
+ Filip Wasilewski
+ Finn Gruwier Larsen
+ Flávio Juvenal da Silva Junior
+ flavio.curella@gmail.com
+ Florian Apolloner
+ Florian Demmer
+ Florian Moussous
+ Fran Hrženjak
+ Francisco Albarran Cristobal
+ Francisco Couzo
+ François Freitag
+ Frank Tegtmeyer
+ Frank Wierzbicki
+ Frank Wiles
+ František Malina
+ Fraser Nevett
+ Gabriel Grant
+ Gabriel Hurley
+ gandalf@owca.info
+ Garry Lawrence
+ Garry Polley
+ Garth Kidd
+ Gary Wilson
+ Gasper Koren
+ Gasper Zejn
+ Gavin Wahl
+ Ge Hanbin
+ geber@datacollect.com
+ Geert Vanderkelen
+ George Karpenkov
+ George Song
+ George Vilches
+ Georg "Hugo" Bauer
+ Georgi Stanojevski
+ Gerardo Orozco
+ Gil Gonçalves
+ Girish Kumar
+ Gisle Aas
+ Glenn Maynard
+ glin@seznam.cz
+ GomoX
+ Gonzalo Saavedra
+ Gopal Narayanan
+ Graham Carlyle
+ Grant Jenks