from django.contrib.auth import get_user_model
from django.core import urlresolvers

from adhocracy4 import emails

User = get_user_model()


class ReportModeratorEmail(emails.ModeratorNotification):
    template_name = 'a4reports/emails/report_moderators'


class ReportCreatorEmail(emails.Email):
    template_name = 'a4reports/emails/report_creator'

    def get_receivers(self):
        return [self.object.content_object.creator]

adhocracy4/reports/emails.py
from django.contrib.auth import get_user_model

from adhocracy4 import emails

User = get_user_model()


class ReportModeratorEmail(emails.ModeratorNotification):
    template_name = 'a4reports/emails/report_moderators'


class ReportCreatorEmail(emails.Email):
    template_name = 'a4reports/emails/report_creator'

    def get_receivers(self):
        return [self.object.content_object.creator]

adhocracy4/reports/emails.py
diff --git a/.editorconfig b/.editorconfig
index 168db4345..d1d512fd1 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -6,14 +6,15 @@ insert_final_newline = true
 trim_trailing_whitespace = true
 charset = utf-8
 indent_style = space
-
-[*.{py,html,css,scss}]
 indent_size = 4
 
 [*.{js,jsx}]
 indent_size = 2
 
-# isort configruation
+[Makefile]
+indent_style = tab
+
+# isort configuration
 [*.py]
 skip=migrations
 known_first_party=adhocracy4, tests, euth, euth_wagtail
diff --git a/.eslintrc b/.eslintrc
new file mode 100644
index 000000000..fdefb7c3c
--- /dev/null
+++ b/.eslintrc
@@ -0,0 +1,6 @@
+{
+  "extends": ["standard", "standard-jsx"],
+  "rules": {
+    "jsx-quotes": [2, "prefer-double"]
+  }
+}
diff --git a/.polylintrc b/.polylintrc
new file mode 100644
index 000000000..23b0d167d
--- /dev/null
+++ b/.polylintrc
@@ -0,0 +1,2 @@
+py:flake8 --exclude */migrations/*,*/settings*,setup.py %s
+js\\|jsx:node_modules/.bin/eslint -c .eslintrc --ext js,jsx %s
diff --git a/Makefile b/Makefile
index d001cdc47..680d4903d 100644
--- a/Makefile
+++ b/Makefile
@@ -18,7 +18,10 @@ install:
 	$(VIRTUAL_ENV)/bin/python3 setup.py development
 
 lint:
-	$(VIRTUAL_ENV)/bin/flake8 $(SOURCE_DIRS) --exclude migrations,settings*
+	. $(VIRTUAL_ENV)/bin/activate && node_modules/.bin/polylint
+
+lint-quick:
+	. $(VIRTUAL_ENV)/bin/activate && node_modules/.bin/polylint -SF
 
 test:
 	$(VIRTUAL_ENV)/bin/pytest
diff --git a/adhocracy4/comments/static/comments/CommentBox.jsx b/adhocracy4/comments/static/comments/CommentBox.jsx
index ec7d4fc4a..045b52355 100644
--- a/adhocracy4/comments/static/comments/CommentBox.jsx
+++ b/adhocracy4/comments/static/comments/CommentBox.jsx
@@ -4,7 +4,6 @@ var api = require('../../../static/api')
 
 var React = require('react')
 var update = require('react-addons-update')
-var moment = require('moment')
 var django = require('django')
 
 let CommentBox = React.createClass({
@@ -93,7 +92,7 @@ CommentBox.childContextTypes = {
   isAuthenticated: React.PropTypes.bool,
   isModerator: React.PropTypes.bool,
   comments_contenttype: React.PropTypes.number,
-  user_name: React.PropTypes.string,
+  user_name: React.PropTypes.string
 }
 
 module.exports = CommentBox
diff --git a/adhocracy4/comments/static/comments/CommentManageDropdown.jsx b/adhocracy4/comments/static/comments/CommentManageDropdown.jsx
index b3ca52008..a2e9383d9 100644
--- a/adhocracy4/comments/static/comments/CommentManageDropdown.jsx
+++ b/adhocracy4/comments/static/comments/CommentManageDropdown.jsx
@@ -7,7 +7,7 @@ const CommentManageDropdown = (props) => {
       <li className="dropdown">
         <button type="button" className="dropdown-toggle" aria-haspopup="true"
           aria-expanded="false" data-toggle="dropdown">
-          <i className="fa fa-ellipsis-h" aria-hidden="true"></i>
+          <i className="fa fa-ellipsis-h" aria-hidden="true" />
         </button>
         <ul className="dropdown-menu">
           {props.renderModeratorOptions && [
diff --git a/adhocracy4/comments/static/comments/CommentReplyBar.jsx b/adhocracy4/comments/static/comments/CommentReplyBar.jsx
index 0dadfbca4..d58a047cb 100644
--- a/adhocracy4/comments/static/comments/CommentReplyBar.jsx
+++ b/adhocracy4/comments/static/comments/CommentReplyBar.jsx
@@ -21,7 +21,7 @@ const CommentReplyBar = (props) => {
   if (props.allowForm) {
     replyButton = (
       <button className="comment-reply-button" type="button" onClick={props.showComments}>
-        <i className="fa fa-reply" aria-hidden="true"></i>
+        <i className="fa fa-reply" aria-hidden="true" />
         {django.gettext('Answer')}
       </button>
     )
diff --git a/adhocracy4/reports/emails.py b/adhocracy4/reports/emails.py
index 5df6e57c2..2e32d8833 100644
--- a/adhocracy4/reports/emails.py
+++ b/adhocracy4/reports/emails.py
@@ -1,5 +1,4 @@
 from django.contrib.auth import get_user_model
-from django.core import urlresolvers
 
 from adhocracy4 import emails
 
diff --git a/adhocracy4/static/Modal.jsx b/adhocracy4/static/Modal.jsx
index 1b6097647..4d52adf10 100644
--- a/adhocracy4/static/Modal.jsx
+++ b/adhocracy4/static/Modal.jsx
@@ -1,19 +1,18 @@
-let React = require('react');
-let django = require('django');
+let React = require('react')
+let django = require('django')
 
 export const Modal = React.createClass({
   render: function () {
-    let dismiss = this.props.dismissOnSubmit ? 'modal' : 'false';
+    let dismiss = this.props.dismissOnSubmit ? 'modal' : 'false'
     return (
       <div className="modal fade" id={this.props.name} tabIndex="-1"
-           role="dialog" aria-labelledby="myModalLabel">
+        role="dialog" aria-labelledby="myModalLabel">
         <div className="modal-dialog modal-lg" role="document">
           <div className="modal-content">
             <div className="modal-header">
               <button className="close" aria-label={this.props.abort}
-                      data-dismiss="modal"
-                      onClick={this.props.closeHandler}>
-                <i className="fa fa-times"/>
+                data-dismiss="modal" onClick={this.props.closeHandler}>
+                <i className="fa fa-times" />
               </button>
             </div>
 
@@ -26,11 +25,11 @@ export const Modal = React.createClass({
             <div className="modal-footer">
               <div className="row">
                 <button className="submit-button" data-dismiss={dismiss}
-                        onClick={this.props.submitHandler}>{this.props.action}</button>
+                  onClick={this.props.submitHandler}>{this.props.action}</button>
               </div>
               <div className="row">
                 <button className="cancel-button" data-dismiss="modal"
-                        onClick={this.props.closeHandler}>{this.props.abort}</button>
+                  onClick={this.props.closeHandler}>{this.props.abort}</button>
               </div>
             </div>
             }
@@ -39,7 +38,7 @@ export const Modal = React.createClass({
       </div>
     )
   }
-});
+})
 
 Modal.propTypes = {
   submitHandler: React.PropTypes.func,
diff --git a/package.json b/package.json
index 885a14ee0..8734276c1 100644
--- a/package.json
+++ b/package.json
@@ -22,13 +22,20 @@
     "react-dom": "15.1.0"
   },
   "devDependencies": {
-    "husky": "0.11.4"
+    "eslint": "^3.7.1",
+    "eslint-config-standard": "^6.2.0",
+    "eslint-config-standard-jsx": "^3.2.0",
+    "eslint-plugin-promise": "^3.0.0",
+    "eslint-plugin-react": "^6.4.1",
+    "eslint-plugin-standard": "^2.0.1",
+    "husky": "0.11.4",
+    "polylint.sh": "0.0.1"
   },
   "repository": {
     "type": "git",
     "url": "git@github.com:liqd/adhocracy4.git"
   },
   "scripts": {
-    "precommit": "make lint"
+    "precommit": "make lint-quick"
   }
 }

Extend linting to javascript and jsx files

