Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
AE UTBM
Sith
Commits
792d66da
Commit
792d66da
authored
Aug 10, 2016
by
Skia
🤘
Browse files
Add nice whole file support
parent
6fbf6074
Pipeline
#106
failed with stage
in 1 minute and 52 seconds
Changes
51
Pipelines
1
Expand all
Hide whitespace changes
Inline
Side-by-side
accounting/migrations/0017_auto_20160810_0547.py
0 → 100644
View file @
792d66da
# -*- coding: utf-8 -*-
from
__future__
import
unicode_literals
from
django.db
import
migrations
,
models
class
Migration
(
migrations
.
Migration
):
dependencies
=
[
(
'accounting'
,
'0016_auto_20160807_2000'
),
]
operations
=
[
migrations
.
AlterField
(
model_name
=
'operation'
,
name
=
'invoice'
,
field
=
models
.
ForeignKey
(
blank
=
True
,
related_name
=
'operations'
,
to
=
'core.SithFile'
,
null
=
True
,
verbose_name
=
'invoice'
),
),
]
accounting/models.py
View file @
792d66da
...
...
@@ -7,7 +7,7 @@ from django.utils.translation import ugettext_lazy as _
from
django.template
import
defaultfilters
from
decimal
import
Decimal
from
core.models
import
User
from
core.models
import
User
,
SithFile
from
club.models
import
Club
class
CurrencyField
(
models
.
DecimalField
):
...
...
@@ -156,7 +156,7 @@ class Operation(models.Model):
remark
=
models
.
TextField
(
_
(
'remark'
),
max_length
=
255
)
mode
=
models
.
CharField
(
_
(
'payment method'
),
max_length
=
255
,
choices
=
settings
.
SITH_ACCOUNTING_PAYMENT_METHOD
)
cheque_number
=
models
.
IntegerField
(
_
(
'cheque number'
),
default
=-
1
)
invoice
=
models
.
F
ileField
(
upload_to
=
'invoice
s'
,
verbose_name
=
_
(
"invoice"
),
null
=
True
,
blank
=
True
)
invoice
=
models
.
F
oreignKey
(
SithFile
,
related_name
=
'operation
s'
,
verbose_name
=
_
(
"invoice"
),
null
=
True
,
blank
=
True
)
done
=
models
.
BooleanField
(
_
(
'is done'
),
default
=
False
)
accounting_type
=
models
.
ForeignKey
(
'AccountingType'
,
related_name
=
"operations"
,
verbose_name
=
_
(
"accounting type"
))
target_type
=
models
.
CharField
(
_
(
'target type'
),
max_length
=
10
,
...
...
accounting/templates/accounting/journal_details.jinja
View file @
792d66da
...
...
@@ -27,6 +27,7 @@
<td>
{%
trans
%}
Nature
{%
endtrans
%}
</td>
<td>
{%
trans
%}
Done
{%
endtrans
%}
</td>
<td>
{%
trans
%}
Comment
{%
endtrans
%}
</td>
<td>
{%
trans
%}
File
{%
endtrans
%}
</td>
<td>
{%
trans
%}
Actions
{%
endtrans
%}
</td>
</tr>
</thead>
...
...
@@ -51,6 +52,11 @@
<td>
{%
trans
%}
No
{%
endtrans
%}
</td>
{%
endif
%}
<td>
{{
o.remark
}}
</td>
{%
if
o.invoice
%}
<td><a
href=
"
{{
url
(
'core:download'
)
+
'?file='
+
o.invoice.name
}}
"
>
{{
o.invoice.name
}}
</a></td>
{%
else
%}
<td>
-
</td>
{%
endif
%}
<td>
{%
if
not
o.journal.closed
%}
<a
href=
"
{{
url
(
'accounting:op_edit'
,
op_id
=
o.id
)
}}
"
>
{%
trans
%}
Edit
{%
endtrans
%}
</a>
...
...
accounting/views.py
View file @
792d66da
...
...
@@ -4,8 +4,10 @@ from django.shortcuts import render
from
django.core.urlresolvers
import
reverse_lazy
from
django.forms.models
import
modelform_factory
from
django.forms
import
HiddenInput
from
django.forms.extras.widgets
import
SelectDateWidget
from
core.views
import
CanViewMixin
,
CanEditMixin
,
CanEditPropMixin
,
CanCreateMixin
from
core.views.forms
import
SelectFile
from
accounting.models
import
BankAccount
,
ClubAccount
,
GeneralJournal
,
Operation
,
AccountingType
,
Company
# Accounting types
...
...
@@ -166,7 +168,7 @@ class OperationCreateView(CanCreateMixin, CreateView):
form_class
=
modelform_factory
(
Operation
,
fields
=
[
'amount'
,
'label'
,
'remark'
,
'journal'
,
'target_type'
,
'target_id'
,
'target_label'
,
'date'
,
'mode'
,
'cheque_number'
,
'invoice'
,
'accounting_type'
,
'done'
],
widgets
=
{
'journal'
:
HiddenInput
})
widgets
=
{
'journal'
:
HiddenInput
,
'date'
:
SelectDateWidget
})
template_name
=
'core/create.jinja'
def
get_initial
(
self
):
...
...
@@ -183,8 +185,10 @@ class OperationEditView(CanEditMixin, UpdateView):
"""
model
=
Operation
pk_url_kwarg
=
"op_id"
fields
=
[
'amount'
,
'label'
,
'remark'
,
'target_type'
,
'target_id'
,
'target_label'
,
'date'
,
'mode'
,
'cheque_number'
,
'invoice'
,
'accounting_type'
,
'done'
]
form_class
=
modelform_factory
(
Operation
,
fields
=
[
'amount'
,
'label'
,
'remark'
,
'target_type'
,
'target_id'
,
'target_label'
,
'date'
,
'mode'
,
'cheque_number'
,
'invoice'
,
'accounting_type'
,
'done'
],
widgets
=
{
'date'
:
SelectDateWidget
,
'invoice'
:
SelectFile
})
template_name
=
'core/edit.jinja'
# Company views
...
...
core/admin.py
View file @
792d66da
from
django.contrib
import
admin
from
core.models
import
User
,
Page
,
RealGroup
from
core.models
import
User
,
Page
,
RealGroup
,
SithFile
from
django.contrib.auth.models
import
Group
as
AuthGroup
...
...
@@ -7,4 +7,5 @@ admin.site.register(User)
admin
.
site
.
unregister
(
AuthGroup
)
admin
.
site
.
register
(
RealGroup
)
admin
.
site
.
register
(
Page
)
admin
.
site
.
register
(
SithFile
)
core/migrations/0009_auto_20160810_0547.py
0 → 100644
View file @
792d66da
# -*- coding: utf-8 -*-
from
__future__
import
unicode_literals
from
django.db
import
migrations
,
models
import
django.db.models.deletion
import
core.models
from
django.conf
import
settings
class
Migration
(
migrations
.
Migration
):
dependencies
=
[
(
'core'
,
'0008_pagerev_revision'
),
]
operations
=
[
migrations
.
CreateModel
(
name
=
'SithFile'
,
fields
=
[
(
'id'
,
models
.
AutoField
(
serialize
=
False
,
verbose_name
=
'ID'
,
auto_created
=
True
,
primary_key
=
True
)),
(
'name'
,
models
.
CharField
(
max_length
=
30
,
verbose_name
=
'file name'
)),
(
'file'
,
models
.
FileField
(
upload_to
=
core
.
models
.
get_directory
,
blank
=
True
,
null
=
True
,
verbose_name
=
'file'
)),
(
'is_folder'
,
models
.
BooleanField
(
default
=
True
,
verbose_name
=
'is folder'
)),
(
'mime_type'
,
models
.
CharField
(
max_length
=
30
,
verbose_name
=
'mime type'
)),
(
'size'
,
models
.
IntegerField
(
default
=
0
,
verbose_name
=
'size'
)),
(
'date'
,
models
.
DateTimeField
(
auto_now
=
True
,
verbose_name
=
'date'
)),
(
'edit_groups'
,
models
.
ManyToManyField
(
to
=
'core.Group'
,
blank
=
True
,
verbose_name
=
'edit group'
,
related_name
=
'editable_files'
)),
(
'owner'
,
models
.
ForeignKey
(
related_name
=
'owned_files'
,
to
=
settings
.
AUTH_USER_MODEL
,
verbose_name
=
'owner'
)),
(
'parent'
,
models
.
ForeignKey
(
blank
=
True
,
related_name
=
'children'
,
to
=
'core.SithFile'
,
null
=
True
,
verbose_name
=
'parent'
)),
(
'view_groups'
,
models
.
ManyToManyField
(
to
=
'core.Group'
,
blank
=
True
,
verbose_name
=
'view group'
,
related_name
=
'viewable_files'
)),
],
options
=
{
'verbose_name'
:
'file'
,
},
),
migrations
.
AlterField
(
model_name
=
'page'
,
name
=
'edit_groups'
,
field
=
models
.
ManyToManyField
(
to
=
'core.Group'
,
blank
=
True
,
verbose_name
=
'edit group'
,
related_name
=
'editable_page'
),
),
migrations
.
AlterField
(
model_name
=
'page'
,
name
=
'owner_group'
,
field
=
models
.
ForeignKey
(
default
=
1
,
related_name
=
'owned_page'
,
to
=
'core.Group'
,
verbose_name
=
'owner group'
),
),
migrations
.
AlterField
(
model_name
=
'page'
,
name
=
'parent'
,
field
=
models
.
ForeignKey
(
on_delete
=
django
.
db
.
models
.
deletion
.
SET_NULL
,
blank
=
True
,
related_name
=
'children'
,
to
=
'core.Page'
,
null
=
True
,
verbose_name
=
'parent'
),
),
migrations
.
AlterField
(
model_name
=
'page'
,
name
=
'view_groups'
,
field
=
models
.
ManyToManyField
(
to
=
'core.Group'
,
blank
=
True
,
verbose_name
=
'view group'
,
related_name
=
'viewable_page'
),
),
]
core/models.py
View file @
792d66da
...
...
@@ -287,6 +287,108 @@ class Preferences(models.Model):
help_text
=
_
(
'Show your account statistics to others'
),
)
def
get_directory
(
instance
,
filename
):
return
'./{0}/{1}'
.
format
(
instance
.
get_parent_path
(),
filename
)
class
SithFile
(
models
.
Model
):
name
=
models
.
CharField
(
_
(
'file name'
),
max_length
=
30
,
blank
=
False
)
parent
=
models
.
ForeignKey
(
'self'
,
related_name
=
"children"
,
verbose_name
=
_
(
"parent"
),
null
=
True
,
blank
=
True
)
file
=
models
.
FileField
(
upload_to
=
get_directory
,
verbose_name
=
_
(
"file"
),
null
=
True
,
blank
=
True
)
owner
=
models
.
ForeignKey
(
User
,
related_name
=
"owned_files"
,
verbose_name
=
_
(
"owner"
))
edit_groups
=
models
.
ManyToManyField
(
Group
,
related_name
=
"editable_files"
,
verbose_name
=
_
(
"edit group"
),
blank
=
True
)
view_groups
=
models
.
ManyToManyField
(
Group
,
related_name
=
"viewable_files"
,
verbose_name
=
_
(
"view group"
),
blank
=
True
)
is_folder
=
models
.
BooleanField
(
_
(
"is folder"
),
default
=
True
)
mime_type
=
models
.
CharField
(
_
(
'mime type'
),
max_length
=
30
)
size
=
models
.
IntegerField
(
_
(
"size"
),
default
=
0
)
date
=
models
.
DateTimeField
(
_
(
'date'
),
auto_now
=
True
)
class
Meta
:
verbose_name
=
_
(
"file"
)
def
is_owned_by
(
self
,
user
):
return
user
.
id
==
self
.
owner
.
id
def
delete
(
self
):
for
c
in
self
.
children
.
all
():
c
.
delete
()
self
.
file
.
delete
()
return
super
(
SithFile
,
self
).
delete
()
def
clean
(
self
):
"""
Cleans up the file
"""
super
(
SithFile
,
self
).
clean
()
if
'/'
in
self
.
name
:
raise
ValidationError
(
_
(
"Character '/' not authorized in name"
))
if
self
==
self
.
parent
:
raise
ValidationError
(
_
(
'Loop in folder tree'
),
code
=
'loop'
,
)
if
(
self
==
self
.
parent
or
(
self
.
parent
is
not
None
and
self
in
self
.
get_parent_list
())):
raise
ValidationError
(
_
(
'Loop in folder tree'
),
code
=
'loop'
,
)
if
self
.
parent
and
self
.
parent
.
is_file
:
raise
ValidationError
(
_
(
'You can not make a file be a children of a non folder file'
))
if
((
self
.
parent
is
None
and
SithFile
.
objects
.
exclude
(
id
=
self
.
id
).
filter
(
parent
=
None
,
name
=
self
.
name
).
exists
())
or
(
self
.
parent
and
self
.
parent
.
children
.
exclude
(
id
=
self
.
id
).
filter
(
name
=
self
.
name
).
exists
())):
raise
ValidationError
(
_
(
'Duplicate file'
),
code
=
'duplicate'
,
)
if
self
.
is_folder
:
try
:
self
.
file
.
delete
()
except
:
pass
self
.
file
=
None
self
.
mime_type
=
"inode/directory"
if
self
.
is_file
and
(
self
.
file
is
None
or
self
.
file
==
""
):
raise
ValidationError
(
_
(
"You must provide a file"
))
def
save
(
self
,
*
args
,
**
kwargs
):
copy_rights
=
False
if
self
.
id
is
None
:
copy_rights
=
True
super
(
SithFile
,
self
).
save
(
*
args
,
**
kwargs
)
if
copy_rights
:
self
.
copy_rights
()
def
copy_rights
(
self
):
"""Copy, if possible, the rights of the parent folder"""
if
self
.
parent
is
not
None
:
self
.
edit_groups
=
self
.
parent
.
edit_groups
.
all
()
self
.
view_groups
=
self
.
parent
.
view_groups
.
all
()
self
.
save
()
def
__getattribute__
(
self
,
attr
):
if
attr
==
"is_file"
:
return
not
self
.
is_folder
else
:
return
object
.
__getattribute__
(
self
,
attr
)
def
__str__
(
self
):
if
self
.
is_folder
:
return
_
(
"Folder: "
)
+
self
.
name
else
:
return
_
(
"File: "
)
+
self
.
name
def
get_parent_list
(
self
):
l
=
[]
p
=
self
.
parent
while
p
is
not
None
:
l
.
append
(
p
)
p
=
p
.
parent
return
l
def
get_parent_path
(
self
):
return
'/'
.
join
([
p
.
name
for
p
in
self
.
get_parent_list
()])
def
get_display_name
(
self
):
return
self
.
name
class
LockError
(
Exception
):
"""There was a lock error on the object"""
pass
...
...
@@ -311,17 +413,16 @@ class Page(models.Model):
query, but don't rely on it when playing with a Page object, use get_full_name() instead!
"""
name
=
models
.
CharField
(
_
(
'page name'
),
max_length
=
30
,
blank
=
False
)
parent
=
models
.
ForeignKey
(
'self'
,
related_name
=
"children"
,
null
=
True
,
blank
=
True
,
on_delete
=
models
.
SET_NULL
)
parent
=
models
.
ForeignKey
(
'self'
,
related_name
=
"children"
,
verbose_name
=
_
(
"parent"
),
null
=
True
,
blank
=
True
,
on_delete
=
models
.
SET_NULL
)
# Attention: this field may not be valid until you call save(). It's made for fast query, but don't rely on it when
# playing with a Page object, use get_full_name() instead!
_full_name
=
models
.
CharField
(
_
(
'page name'
),
max_length
=
255
,
blank
=
True
)
owner_group
=
models
.
ForeignKey
(
Group
,
related_name
=
"owned_page"
,
owner_group
=
models
.
ForeignKey
(
Group
,
related_name
=
"owned_page"
,
verbose_name
=
_
(
"owner group"
),
default
=
settings
.
SITH_GROUPS
[
'root'
][
'id'
])
edit_groups
=
models
.
ManyToManyField
(
Group
,
related_name
=
"editable_page"
,
blank
=
True
)
view_groups
=
models
.
ManyToManyField
(
Group
,
related_name
=
"viewable_page"
,
blank
=
True
)
edit_groups
=
models
.
ManyToManyField
(
Group
,
related_name
=
"editable_page"
,
verbose_name
=
_
(
"edit group"
),
blank
=
True
)
view_groups
=
models
.
ManyToManyField
(
Group
,
related_name
=
"viewable_page"
,
verbose_name
=
_
(
"view group"
),
blank
=
True
)
lock_mutex
=
{}
class
Meta
:
unique_together
=
(
'name'
,
'parent'
)
permissions
=
(
...
...
core/static/core/form.css
View file @
792d66da
...
...
@@ -8,9 +8,9 @@ select,
button
,
textarea
{
margin
:
0
;
border
:
1px
solid
;
padding
:
4
px
;
margin
:
1px
;
border
:
none
;
padding
:
1
px
;
display
:
inline-block
;
vertical-align
:
middle
;
white-space
:
normal
;
...
...
core/static/core/js/jquery-3.1.0.min.js
0 → 100644
View file @
792d66da
This diff is collapsed.
Click to expand it.
core/static/core/js/multiple-select.js
0 → 100644
View file @
792d66da
This diff is collapsed.
Click to expand it.
core/static/core/js/script.js
0 → 100644
View file @
792d66da
console
.
log
(
'
Guy
'
);
$
(
function
()
{
dialog
=
$
(
"
.choose_file_widget
"
).
dialog
({
autoOpen
:
false
,
modal
:
true
,
});
$
(
"
.choose_file_button
"
).
button
().
on
(
"
click
"
,
function
()
{
dialog
.
dialog
(
"
open
"
);
});
}
);
core/static/core/js/ui/AUTHORS.txt
0 → 100644
View file @
792d66da
Authors ordered by first contribution
A list of current team members is available at http://jqueryui.com/about
Paul Bakaus <paul.bakaus@gmail.com>
Richard Worth <rdworth@gmail.com>
Yehuda Katz <wycats@gmail.com>
Sean Catchpole <sean@sunsean.com>
John Resig <jeresig@gmail.com>
Tane Piper <piper.tane@gmail.com>
Dmitri Gaskin <dmitrig01@gmail.com>
Klaus Hartl <klaus.hartl@gmail.com>
Stefan Petre <stefan.petre@gmail.com>
Gilles van den Hoven <gilles@webunity.nl>
Micheil Bryan Smith <micheil@brandedcode.com>
Jörn Zaefferer <joern.zaefferer@gmail.com>
Marc Grabanski <m@marcgrabanski.com>
Keith Wood <kbwood@iinet.com.au>
Brandon Aaron <brandon.aaron@gmail.com>
Scott González <scott.gonzalez@gmail.com>
Eduardo Lundgren <eduardolundgren@gmail.com>
Aaron Eisenberger <aaronchi@gmail.com>
Joan Piedra <theneojp@gmail.com>
Bruno Basto <b.basto@gmail.com>
Remy Sharp <remy@leftlogic.com>
Bohdan Ganicky <bohdan.ganicky@gmail.com>
David Bolter <david.bolter@gmail.com>
Chi Cheng <cloudream@gmail.com>
Ca-Phun Ung <pazu2k@gmail.com>
Ariel Flesler <aflesler@gmail.com>
Maggie Wachs <maggie@filamentgroup.com>
Scott Jehl <scottjehl@gmail.com>
Todd Parker <todd@filamentgroup.com>
Andrew Powell <andrew@shellscape.org>
Brant Burnett <btburnett3@gmail.com>
Douglas Neiner <doug@dougneiner.com>
Paul Irish <paul.irish@gmail.com>
Ralph Whitbeck <ralph.whitbeck@gmail.com>
Thibault Duplessis <thibault.duplessis@gmail.com>
Dominique Vincent <dominique.vincent@toitl.com>
Jack Hsu <jack.hsu@gmail.com>
Adam Sontag <ajpiano@ajpiano.com>
Carl Fürstenberg <carl@excito.com>
Kevin Dalman <development@allpro.net>
Alberto Fernández Capel <afcapel@gmail.com>
Jacek Jędrzejewski (http://jacek.jedrzejewski.name)
Ting Kuei <ting@kuei.com>
Samuel Cormier-Iijima <sam@chide.it>
Jon Palmer <jonspalmer@gmail.com>
Ben Hollis <bhollis@amazon.com>
Justin MacCarthy <Justin@Rubystars.biz>
Eyal Kobrigo <kobrigo@hotmail.com>
Tiago Freire <tiago.freire@gmail.com>
Diego Tres <diegotres@gmail.com>
Holger Rüprich <holger@rueprich.de>
Ziling Zhao <zilingzhao@gmail.com>
Mike Alsup <malsup@gmail.com>
Robson Braga Araujo <robsonbraga@gmail.com>
Pierre-Henri Ausseil <ph.ausseil@gmail.com>
Christopher McCulloh <cmcculloh@gmail.com>
Andrew Newcomb <ext.github@preceptsoftware.co.uk>
Lim Chee Aun <cheeaun@gmail.com>
Jorge Barreiro <yortx.barry@gmail.com>
Daniel Steigerwald <daniel@steigerwald.cz>
John Firebaugh <john_firebaugh@bigfix.com>
John Enters <github@darkdark.net>
Andrey Kapitcyn <ru.m157y@gmail.com>
Dmitry Petrov <dpetroff@gmail.com>
Eric Hynds <eric@hynds.net>
Chairat Sunthornwiphat <pipo@sixhead.com>
Josh Varner <josh.varner@gmail.com>
Stéphane Raimbault <stephane.raimbault@gmail.com>
Jay Merrifield <fracmak@gmail.com>
J. Ryan Stinnett <jryans@gmail.com>
Peter Heiberg <peter@heiberg.se>
Alex Dovenmuehle <adovenmuehle@gmail.com>
Jamie Gegerson <git@jamiegegerson.com>
Raymond Schwartz <skeetergraphics@gmail.com>
Phillip Barnes <philbar@gmail.com>
Kyle Wilkinson <kai@wikyd.org>
Khaled AlHourani <me@khaledalhourani.com>
Marian Rudzynski <mr@impaled.org>
Jean-Francois Remy <jeff@melix.org>
Doug Blood <dougblood@gmail.com>
Filippo Cavallarin <filippo.cavallarin@codseq.it>
Heiko Henning <heiko@thehennings.ch>
Aliaksandr Rahalevich <saksmlz@gmail.com>
Mario Visic <mario@mariovisic.com>
Xavi Ramirez <xavi.rmz@gmail.com>
Max Schnur <max.schnur@gmail.com>
Saji Nediyanchath <saji89@gmail.com>
Corey Frang <gnarf37@gmail.com>
Aaron Peterson <aaronp123@yahoo.com>
Ivan Peters <ivan@ivanpeters.com>
Mohamed Cherif Bouchelaghem <cherifbouchelaghem@yahoo.fr>
Marcos Sousa <falecomigo@marcossousa.com>
Michael DellaNoce <mdellanoce@mailtrust.com>
George Marshall <echosx@gmail.com>
Tobias Brunner <tobias@strongswan.org>
Martin Solli <msolli@gmail.com>
David Petersen <public@petersendidit.com>
Dan Heberden <danheberden@gmail.com>
William Kevin Manire <williamkmanire@gmail.com>
Gilmore Davidson <gilmoreorless@gmail.com>
Michael Wu <michaelmwu@gmail.com>
Adam Parod <mystic414@gmail.com>
Guillaume Gautreau <guillaume+github@ghusse.com>
Marcel Toele <EleotleCram@gmail.com>
Dan Streetman <ddstreet@ieee.org>
Matt Hoskins <matt@nipltd.com>
Giovanni Giacobbi <giovanni@giacobbi.net>
Kyle Florence <kyle.florence@gmail.com>
Pavol Hluchý <lopo@losys.sk>
Hans Hillen <hans.hillen@gmail.com>
Mark Johnson <virgofx@live.com>
Trey Hunner <treyhunner@gmail.com>
Shane Whittet <whittet@gmail.com>
Edward A Faulkner <ef@alum.mit.edu>
Adam Baratz <adam@adambaratz.com>
Kato Kazuyoshi <kato.kazuyoshi@gmail.com>
Eike Send <eike.send@gmail.com>
Kris Borchers <kris.borchers@gmail.com>
Eddie Monge <eddie@eddiemonge.com>
Israel Tsadok <itsadok@gmail.com>
Carson McDonald <carson@ioncannon.net>
Jason Davies <jason@jasondavies.com>
Garrison Locke <gplocke@gmail.com>
David Murdoch <david@davidmurdoch.com>
Benjamin Scott Boyle <benjamins.boyle@gmail.com>
Jesse Baird <jebaird@gmail.com>
Jonathan Vingiano <jvingiano@gmail.com>
Dylan Just <dev@ephox.com>
Hiroshi Tomita <tomykaira@gmail.com>
Glenn Goodrich <glenn.goodrich@gmail.com>
Tarafder Ashek-E-Elahi <mail.ashek@gmail.com>
Ryan Neufeld <ryan@neufeldmail.com>
Marc Neuwirth <marc.neuwirth@gmail.com>
Philip Graham <philip.robert.graham@gmail.com>
Benjamin Sterling <benjamin.sterling@kenzomedia.com>
Wesley Walser <waw325@gmail.com>
Kouhei Sutou <kou@clear-code.com>
Karl Kirch <karlkrch@gmail.com>
Chris Kelly <ckdake@ckdake.com>
Jason Oster <jay@kodewerx.org>
Felix Nagel <info@felixnagel.com>
Alexander Polomoshnov <alex.polomoshnov@gmail.com>
David Leal <dgleal@gmail.com>
Igor Milla <igor.fsp.milla@gmail.com>
Dave Methvin <dave.methvin@gmail.com>
Florian Gutmann <f.gutmann@chronimo.com>
Marwan Al Jubeh <marwan.aljubeh@gmail.com>
Milan Broum <midlis@googlemail.com>
Sebastian Sauer <info@dynpages.de>
Gaëtan Muller <m.gaetan89@gmail.com>
Michel Weimerskirch <michel@weimerskirch.net>
William Griffiths <william@ycymro.com>
Stojce Slavkovski <stojce@gmail.com>
David Soms <david.soms@gmail.com>
David De Sloovere <david.desloovere@outlook.com>
Michael P. Jung <michael.jung@terreon.de>
Shannon Pekary <spekary@gmail.com>
Dan Wellman <danwellman@hotmail.com>
Matthew Edward Hutton <meh@corefiling.co.uk>
James Khoury <james@jameskhoury.com>
Rob Loach <robloach@gmail.com>
Alberto Monteiro <betimbrasil@gmail.com>
Alex Rhea <alex.rhea@gmail.com>
Krzysztof Rosiński <rozwell69@gmail.com>
Ryan Olton <oltonr@gmail.com>
Genie <386@mail.com>
Rick Waldron <waldron.rick@gmail.com>
Ian Simpson <spoonlikesham@gmail.com>
Lev Kitsis <spam4lev@gmail.com>
TJ VanToll <tj.vantoll@gmail.com>
Justin Domnitz <jdomnitz@gmail.com>
Douglas Cerna <douglascerna@yahoo.com>
Bert ter Heide <bertjh@hotmail.com>
Jasvir Nagra <jasvir@gmail.com>
Yuriy Khabarov <13real008@gmail.com>
Harri Kilpiö <harri.kilpio@gmail.com>
Lado Lomidze <lado.lomidze@gmail.com>
Amir E. Aharoni <amir.aharoni@mail.huji.ac.il>
Simon Sattes <simon.sattes@gmail.com>
Jo Liss <joliss42@gmail.com>
Guntupalli Karunakar <karunakarg@yahoo.com>
Shahyar Ghobadpour <shahyar@gmail.com>
Lukasz Lipinski <uzza17@gmail.com>
Timo Tijhof <krinklemail@gmail.com>
Jason Moon <jmoon@socialcast.com>
Martin Frost <martinf55@hotmail.com>
Eneko Illarramendi <eneko@illarra.com>
EungJun Yi <semtlenori@gmail.com>
Courtland Allen <courtlandallen@gmail.com>
Viktar Varvanovich <non4eg@gmail.com>
Danny Trunk <dtrunk90@gmail.com>
Pavel Stetina <pavel.stetina@nangu.tv>
Michael Stay <metaweta@gmail.com>
Steven Roussey <sroussey@gmail.com>
Michael Hollis <hollis21@gmail.com>
Lee Rowlands <lee.rowlands@previousnext.com.au>
Timmy Willison <timmywillisn@gmail.com>
Karl Swedberg <kswedberg@gmail.com>
Baoju Yuan <the_guy_1987@hotmail.com>
Maciej Mroziński <maciej.k.mrozinski@gmail.com>
Luis Dalmolin <luis.nh@gmail.com>
Mark Aaron Shirley <maspwr@gmail.com>
Martin Hoch <martin@fidion.de>
Jiayi Yang <tr870829@gmail.com>
Philipp Benjamin Köppchen <xgxtpbk@gws.ms>
Sindre Sorhus <sindresorhus@gmail.com>
Bernhard Sirlinger <bernhard.sirlinger@tele2.de>
Jared A. Scheel <jared@jaredscheel.com>
Rafael Xavier de Souza <rxaviers@gmail.com>
John Chen <zhang.z.chen@intel.com>
Robert Beuligmann <robertbeuligmann@gmail.com>
Dale Kocian <dale.kocian@gmail.com>
Mike Sherov <mike.sherov@gmail.com>
Andrew Couch <andy@couchand.com>
Marc-Andre Lafortune <github@marc-andre.ca>
Nate Eagle <nate.eagle@teamaol.com>
David Souther <davidsouther@gmail.com>
Mathias Stenbom <mathias@stenbom.com>
Sergey Kartashov <ebishkek@yandex.ru>
Avinash R <nashpapa@gmail.com>
Ethan Romba <ethanromba@gmail.com>
Cory Gackenheimer <cory.gack@gmail.com>
Juan Pablo Kaniefsky <jpkaniefsky@gmail.com>
Roman Salnikov <bardt.dz@gmail.com>
Anika Henke <anika@selfthinker.org>
Samuel Bovée <samycookie2000@yahoo.fr>
Fabrício Matté <ult_combo@hotmail.com>
Viktor Kojouharov <vkojouharov@gmail.com>
Pawel Maruszczyk (http://hrabstwo.net)
Pavel Selitskas <p.selitskas@gmail.com>
Bjørn Johansen <post@bjornjohansen.no>
Matthieu Penant <thieum22@hotmail.com>
Dominic Barnes <dominic@dbarnes.info>
David Sullivan <david.sullivan@gmail.com>
Thomas Jaggi <thomas@responsive.ch>
Vahid Sohrabloo <vahid4134@gmail.com>
Travis Carden <travis.carden@gmail.com>
Bruno M. Custódio <bruno@brunomcustodio.com>
Nathanael Silverman <nathanael.silverman@gmail.com>
Christian Wenz <christian@wenz.org>
Steve Urmston <steve@urm.st>
Zaven Muradyan <megalivoithos@gmail.com>
Woody Gilk <shadowhand@deviantart.com>
Zbigniew Motyka <zbigniew.motyka@gmail.com>
Suhail Alkowaileet <xsoh.k7@gmail.com>
Toshi MARUYAMA <marutosijp2@yahoo.co.jp>
David Hansen <hansede@gmail.com>
Brian Grinstead <briangrinstead@gmail.com>
Christian Klammer <christian314159@gmail.com>
Steven Luscher <jquerycla@steveluscher.com>
Gan Eng Chin <engchin.gan@gmail.com>
Gabriel Schulhof <gabriel.schulhof@intel.com>
Alexander Schmitz <arschmitz@gmail.com>
Vilhjálmur Skúlason <vis@dmm.is>
Siebrand Mazeland <siebrand@kitano.nl>
Mohsen Ekhtiari <mohsenekhtiari@yahoo.com>
Pere Orga <gotrunks@gmail.com>
Jasper de Groot <mail@ugomobi.com>
Stephane Deschamps <stephane.deschamps@gmail.com>
Jyoti Deka <dekajp@gmail.com>
Andrei Picus <office.nightcrawler@gmail.com>
Ondrej Novy <novy@ondrej.org>
Jacob McCutcheon <jacob.mccutcheon@gmail.com>
Monika Piotrowicz <monika.piotrowicz@gmail.com>
Imants Horsts <imants.horsts@inbox.lv>
Eric Dahl <eric.c.dahl@gmail.com>
Dave Stein <dave@behance.com>
Dylan Barrell <dylan@barrell.com>
Daniel DeGroff <djdegroff@gmail.com>
Michael Wiencek <mwtuea@gmail.com>
Thomas Meyer <meyertee@gmail.com>
Ruslan Yakhyaev <ruslan@ruslan.io>
Brian J. Dowling <bjd-dev@simplicity.net>
Ben Higgins <ben@extrahop.com>
Yermo Lamers <yml@yml.com>
Patrick Stapleton <github@gdi2290.com>
Trisha Crowley <trisha.crowley@gmail.com>
Usman Akeju <akeju00+github@gmail.com>
Rodrigo Menezes <rod333@gmail.com>