GithubHelp home page GithubHelp logo

civiwiki / openciviwiki Goto Github PK

View Code? Open in Web Editor NEW
585.0 24.0 345.0 31.41 MB

Building a Better Democracy for the Internet Age

Home Page: https://civi.wiki

License: Other

Python 35.61% JavaScript 18.42% HTML 28.44% Less 16.03% Procfile 0.02% CSS 1.47%
legislation legislative-bill-analysis civic-tech civic-engagement democracy participatory-democracy volunteers django django-rest-framework congress

openciviwiki's Introduction

openciviwiki's People

Contributors

a7madnassar avatar abhijithganesh avatar allcontributors[bot] avatar aniket-banyal avatar apoorvakashyap avatar brianpainter avatar brylie avatar dcalliet avatar earthprelude avatar gorkemarslan avatar hmajid2301 avatar jl24 avatar joo33 avatar jstrang avatar max1204 avatar mdwest avatar mharyam avatar nehemiah60 avatar north15 avatar pscheid2 avatar pyup-bot avatar simar5244 avatar slau8 avatar tberm avatar tomaszkolek avatar tractaylor avatar wassafshahzad avatar wippo-devops avatar xuro4 avatar znhv avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

openciviwiki's Issues

Add label for new contributors and promote new contributor issues

As part of our community building and outreach efforts, we can maintain a list of issues that are good for new contributors. We can also promote the new issues list via social media and developer communities.

Goal

  • Create a label to track issues that are good for new contributors to take
  • (automatically) Promote the new contributor issues via existing developer networks

Existing communities

Civi revision approval flow

Note: The idea here would be to make CiviWiki the "GitHub for democracy".

User story

As a civi author
I would like to allow other members to suggest edits to my civis
so I can approve edits and collaborate with other community members

Goal

Create a workflow that would allow Issues to be edited by multiple persons. The workflow should have a primary 'editor', who is responsible for approving changes.

Integrate OpenStates and Pro-Publica Congress APIs

Goals

  1. Integrate OpenStates API and Pro-Publica Congress API into CiviWiki allowing:
    • Attachment of bills to Solution Civies
    • Local viewing of Bill information for attached bills (Bill summary, Bill Text, Bill status)
    • Tracking of Representatives Voting on Attached Bills
  2. Develop a basic, but expandable, algorithm to compare the percentage of time any representatives’ voting on attached bills aligns with any any constituent users’ subset of supported/opposed bills.

Minimum Features

  • Autocomplete search form to search and attach bill if the user knows the title or bill number
    • Automatically saving all active bill titles (and historical bills in case someone supports a previously defeated bill) to local database.
  • Link to key information of any legislation attached to a Civi (Opened in new window)
    • Possibly saving this information to our database for any legislation attached to a Civi.
  • Percentage ratio of agreement with Representatives displayed on account page
  • Progress of bills listed on My issues (in committee, first reading, second reading, third reading, passed/defeated, signed by executive)
  • Number of users supporting/opposing bills (Nationally, by state, by district)
    • To be used on representative pages by our lead developer

Design Considerations

  • We will advise users to complete bill research using existing services such as billtrack50.com. Accordingly, this system only needs to link all bills, track attached bills and allow users to quickly reference key information about attached bills
  • Minimize the amount of information we need to store on our servers while ensuring stable access to essential legislative information.

Roadmap

  • Research Open States data model and API
  • Research Pro-Publica data model and API
  • #50 Design CiviWiki API endpoints (contract-first)
    • Bill search
    • Bill detail
    • Representative
    • Vote
    • Jurisdiction
    • Issues
  • Design CiviWiki data model(s) (conceptual model)
    • Bill data model
    • Issue
    • Representative
    • Jurisdiction
    • Vote
  • Create UI wireframe iteration
    • Bill search
    • Attaching a bill to Civi
  • Develop CiviWiki APIs based on design file
    • Bill search
    • Bill detail
    • Representative
    • Vote
    • Jurisdiction
  • Develop CiviWiki data model(s)
    • Bill
    • Representative
    • Jurisdiction
    • Issues
  • Develop UI elements
    • Bill search
    • Attaching a bill to Civi

Proposed design

screenshot_20170830_124658

https://bramp.github.io/js-sequence-diagrams/
Title: Third-party API integration

Client->Server: (1) call internal API
Server->API: (2) make authenticated request
API->Server: (3) Return data
Note right of Server: Save response to local db
Server->Client: (4) relay data

Note right of Client: Channel
Note right of Server: REST

Development Goal

  1. Allow users to find and link any bill to a Civi
  2. Link users to a description of the bill(outside website link is ok)
  3. Track voting on any bill linked to a civi
    3.a) We need to be compare this representative voting on the Civies the bill is linked to
  4. Track progress of any linked bill through the legislative process.
    4.a) In the future we may use this information to impact our ranking algorithm by promoting popular civies which are about to be voted on.

Data Needed (For any bill linked to a Civi)

  1. Bill Number
  2. Bill Name
  3. Bill Jurisdiction (State Name or federal)
  4. Bill Short Description
  5. Bill Progress (Committee, First Reading, Second Reading, etc.)
  6. Bill Voting (I.E. Votes by representatives on the bill)

Additional Thoughts

Before a Bill is linked to a Civi, we shouldn't store any data on it. Users should be able to search all bill names/numbers available through Openstates/Pro-PublicaCongress, and then link any of those bills to a Civi. Once a bill is linked to a Civi, we then need to save its core info to our database and track it through the legislative process.

Data model

Bill

The Bill collection could have the following fields:

  • identifier: String - unique identifier to identify the bill
  • name: CharField - human-readable name of bill
  • jurisdiction: ForeignKey - relationship to a jurisdiction record
  • description: TextField
  • progress: CharField - stages for bill progress
  • open_states_id: CharField - unique identifier from Open States service, if bill is state-level
  • pro_publica_id: CharField - unique identifier from Pro-Publica service, if bill is federal
  • civis: ManyToManyField - multiple bills can be related to a civi, multiple civis can be related to a bill

A method could be defined to get all votes for a particular bill, using one of Django's built-in backwards relationship helpers

Enhancements for Bills API design

Based on the initial Bills API design review, add the following enhacements:

  • add bill_id field for the ID of the bill in congress or at the state level
  • make scope parameter required
  • add state parameter
    • enum: two letter state codes

Clean up merged/stale branches

There are several branches in this GitHub repository that have been merged or might be stale. Consider deleting merged branches, since they are now part of the main-line, and getting rid of stale branches too.

Goal

Remove old branches for a cleaner development environment.

Consider switching to decorator syntax for model properties

There are often properties defined in the CiviWiki models. The convention seems to be something like:

def _internal_property_function(self):
    return

exposed_property = property(_internal_property_function)

There is an alternative, perhaps more elegant, syntax that uses property decorators:

@property
def exposed_property(self)
    return

Consider using the alternative decorator syntax for CiviWiki model properties.

Make initial project release

Although this project has been under development for some time, it is not too late to make an official, initial release. Once we have determined a project versioning scheme, make an official release on GitHub.

Ignore static files

Git is trying to track changes to the staticfiles directory. Add staticfiles to .gitignore, so Git will not track the default staticfiles directory.

Update project to use Python 3

CiviWiki seems to depend on Python 2.7. What are some of the reasons for staying with 2.7?

Goal

Support the latest features of Python, such as async / await, by updating CiviWiki source/dependencies to support Python 3.

Test project with Django 1.11.x

Django 1.11 is the latest Long Term Support (LTS) release. Test the project with Django 1.11 and upgrade if possible.

Goal

Upgrade project to latest Django LTS release.

Task

  • Deploy testing branch to Heroku
  • Have testers try to find bugs in testing deployment
  • Note any discovered bugs as backlog issues
  • If testing doesn't uncover any bugs, close this issue noting that testing was successful

Use meaningful variables to avoid 'mental mapping'

While this project does not have a clearly defined coding standard, it is a good start to make sure we use meaningful variables to avoid mental mapping. This means that all variables should explain what they are, rather than using, for example, placeholders.

# bad
a = get_apple()
o = get_orange()
s = make_smoothie(a, o)

# good
apple =get_apple()
orange = get_orange()
smoothie = make_smoothie()

Resources

Clean code JavaScript has some good examples that equally apply to Pythin:

Run Flake8 on project code and fix errors

As part of our work to keep the code readable and maintainable, we can use the Flake8 tool to check for code style problems.

Goal

Run the Flake8 tool on the CiviWiki codebase. Identify problems and create a roadmap to resolve errors. Close this issue when our code passes Flake8 tests.

Flake8 report

Flake8 reported several problems with our code, which have been noted in separate issues:

Close this issue once the above issues have been resolved.

Check project for bugs related to undefined variables

When running a Flake8 scan (#33), several errors were reported related to undefined variables.

Goal

Make sure all needed variables are defined in project, to prevent bugs. Pass Flake8 scan, particularly as related to undefined variables.

Task

Check the following variables to see if/how they should be defined, and resolve the related Flake8 errors:

  • ./frontend_views/views.py:171:55: F821 undefined name 'Topic'
  • ./api/read.py:141:37: F821 undefined name 'user'
  • ./api/read.py:143:16: F821 undefined name 'user'
  • ./api/read.py:186:13: F821 undefined name 'problems'
  • ./api/read.py:187:27: F821 undefined name 'problems'
  • ./api/write.py:466:55: F821 undefined name 'default'
  • ./api/write.py:618:34: F821 undefined name 'profile'
  • ./api/write.py:672:90: F821 undefined name 'all_categories'

Merge latest changes from old repository

We may have migrated to this new repository without some of the most recent changes. Lets make sure we have all recent changes by pulling once more from the precious repository.

Remove unused variables

While scanning the project with Flake8 (#33), we received several errors related to unused imports.

Goal

Resolve all Flake8 errors related to unused imports.

Task

The following Flake8 errors should be resolved:

  • ./api/read.py:156:9: F841 local variable 'user_categories' is assigned to but never used
  • ./api/read.py:187:9: F841 local variable 'problems' is assigned to but never used
  • ./api/write.py:17:1: F811 redefinition of unused 'require_post_params' from line 5
  • ./api/write.py:18:1: F811 redefinition of unused 'JsonResponse' from line 4
  • ./api/write.py:19:1: F811 redefinition of unused 'login_required' from line 6
  • ./api/write.py:465:29: F841 local variable 'e' is assigned to but never used
  • ./api/models/civi.py:134:9: F841 local variable 'owner_id' is assigned to but never used

Update README for 0.1 release

Our README is pretty much the first thing people see when visiting this repository. In preparation for the 0.1 release, we should have a well organized README.

Goal

Have a user-friendly, informative README.

Note: the README, like the project, is a work-in-progress. We just want to spruce it up a bit for the 0.1 release.

Task

  • Review current README, checking for
    • overall organization
    • 'out-of-place' text or phrases
    • grammar/spelling
    • missing information
  • Remove unneeded or duplicate text/sections
  • Change structure to fit the perspective of a new community member. E.g.
    • sections should be organized from general to specific
    • from low commitment to high commitment (e.g. trying a demo is easier than fixing a bug)
  • Review guidelines for helpful README files (resources section below)
  • Add sections that are recommended to include in a useful README

Resources

Audit project test coverage

As part of our commitment to code quality, we can measure test coverage in our project.

Goal

Generate a test coverage report. Open an issue/discussion about improving test coverage.

Task

  • install coverage.py as project dependency
  • generate test coverage report
  • share current code coverage with project leaders

Use Django REST Framework for REST endpoints

There is currently a TODO in our api/urls.py to build the API using Django REST Framework (DRF). This issue is to earmark that work, and track progress towards the goal of using DRF for CiviWiki REST APIs.

Use consistent spacing and indentation (Flake8 errors)

After running Flake8 (#33), we received several notices about spaces and indentation in CiviWiki sourcecode.

Goal

Use consistent indentation and spacing throughout CiviWiki sourcecode. Conform to guidelines of PEP-8.

Task

Clean up the following Flake8 errors:

  • ./api/read.py:220:60: E272 multiple spaces before keyword
  • ./api/read.py:220:87: E272 multiple spaces before keyword
  • ./api/write.py:499:19: E271 multiple spaces after keyword
  • ./api/write.py:502:58: E225 missing whitespace around operator
  • ./api/write.py:549:19: E271 multiple spaces after keyword
  • ./api/models/civi.py:41:1: E101 indentation contains mixed spaces and tabs
  • ./api/models/civi.py:41:1: W191 indentation contains tabs
  • ./api/models/civi.py:43:1: E101 indentation contains mixed spaces and tabs
  • ./api/models/civi.py:54:31: E251 unexpected spaces around keyword / parameter equals
  • ./api/models/civi.py:65:1: E101 indentation contains mixed spaces and tabs
  • ./api/models/civi.py:65:1: W191 indentation contains tabs
  • ./api/models/civi.py:67:1: E101 indentation contains mixed spaces and tabs
  • ./api/models/civi.py:116:29: E241 multiple spaces after ':'
  • ./api/models/civi.py:124:5: E301 expected 1 blank line, found 0
  • ./api/models/civi.py:156:39: E225 missing whitespace around operator
  • ./api/models/civi.py:156:42: E221 multiple spaces before operator
  • ./api/models/civi.py:166:48: E225 missing whitespace around operator
  • ./api/models/civi.py:190:1: E101 indentation contains mixed spaces and tabs
  • ./api/models/civi.py:190:1: W191 indentation contains tabs
  • ./api/models/civi.py:191:1: E101 indentation contains mixed spaces and tabs
  • ./api/models/civi.py:208:1: E305 expected 2 blank lines after class or function definition, found 1
  • ./api/models/account.py:88:1: E305 expected 2 blank lines after class or function definition, found 1
  • ./api/models/account.py:169:5: E301 expected 1 blank line, found 0
  • ./api/models/thread.py:57:1: E305 expected 2 blank lines after class or function definition, found 1
  • ./authentication/forms.py:121:297: E251 unexpected spaces around keyword / parameter equals
  • ./authentication/forms.py:121:299: E251 unexpected spaces around keyword / parameter equals
  • ./authentication/forms.py:121:316: E251 unexpected spaces around keyword / parameter equals
  • ./authentication/forms.py:121:318: E251 unexpected spaces around keyword / parameter equals
  • ./authentication/authentication.py:29:5: E301 expected 1 blank line, found 0
  • ./authentication/authentication.py:39:1: E305 expected 2 blank lines after class or function definition, found 1

Reorganize requirements.txt with pip freeze > requirements.txt

For some reason when adding a new project requirement, many lines are changed. This is despite the versions of other requirements remaining the same. As a result, any pull request with a change in requirements may be more difficult to review.

Goal

Have a well-organized (alphabetized) requirements.txt file. Make it obvious what requirements have changed when reviewing pull requests.

Task

  • use pip freeze > requirements.txt to reorganize the requirements.txt file

Dismiss 'New Thread' modal on success

Currently, there is a delay when creating a new thread. The 'thread created' message appears, but the modal is still open.

peek 2017-07-14 21-25

Determine how to optimize the flow when users create new threads, so they receive immediate feedback on success. I.e. the modal might close at the same time the success message displays (while triggering redirect is in progress).

Automatically audit project dependencies

As a general guideline, we should strive to keep our project dependencies up-to-date. In order to help with this, there are online services that can check our project dependencies and indicate when dependencies are insecure or outdated.

Examples

Requires.io is one service that will monitor Python project dependencies. It also offers a badge that can be placed in our README as a reminder to update dependencies.

Pyup will monitor project Python dependencies, and send a pull request when security updates are needed.

Goal

Find an automated method/service to monitor CiviWiki project dependencies. Have a visual indicator in our README for community and contributors to see the dependency status at a glance.

Task

If we decide to go with requires.io, then the following steps are relevant:

  • configure requires.io to audit the CiviWiki project repository
  • add requires.io badge to top of CiviWiki README

Cleanup commented code

In order to keep a clean codebase, we should clean up any code that is not in use. This includes code that has been commented out, without a 'TODO' comment.

Goal

Keep a tidy codebase by removing commented-out code.

Task

Clean up the following files/lines that have commented out code.

/api/models/civi.py

/api/models/hashtag.py

/api/models/rebuttal.py

/api/models/representative.py

/api/models/response.py

/api/read.py

  • OpenCiviWiki/api/read.py

    Lines 14 to 48 in dbacc71

    # # Create your views here.
    # @require_post_params(params=['id'])
    # def topTen(request):
    # '''
    # Given an topic ID, returns the top ten Civis of type Issue
    # (the chain heads)
    # '''
    # topic_id = request.POST.get('id', -1)
    # try:
    # topic = Topic.objects.get(id=int(topic_id))
    # return JsonResponse({'result':Civi.objects.block(topic)})
    # except Topic.DoesNotExist as e:
    # return HttpResponseBadRequest(reason=str(e))
    #
    # def getCategories(request):
    # '''
    # Returns to user list of all Categories
    # '''
    # result = [{'id': c.id, 'name': c.name} for c in Category.objects.all()]
    # return JsonResponse({"result":result})
    #
    # @require_post_params(params=['id'])
    # def getTopics(request):
    # '''
    # Takes in a category ID, returns a list of topics under the category.
    # '''
    # category_id = request.POST.get('id', -1)
    #
    # try:
    # Category.objects.get(id=category_id)
    # except Category.DoesNotExist as e:
    # return HttpResponseBadRequest(reason=str(e))
    #
    # result = [{'id':a.id, 'topic': a.topic, 'bill': a.bill} for a in Topic.objects.filter(category_id=category_id)]
    # return JsonResponse({"result":result})
  • OpenCiviWiki/api/read.py

    Lines 76 to 79 in dbacc71

    # result = {}
    result['representatives'] = []
    # result['issues'] = ['''{"category": "category", "issue":"Example Issue that the User probably cares about" }''']*20
  • # result['issues'] = ['''{"category": "category", "issue":"Example Issue that the User probably cares about" }''']*20
  • OpenCiviWiki/api/read.py

    Lines 158 to 159 in dbacc71

    # feed_threads = [Thread.objects.summarize(t) for t in Thread.objects.filter_by_category(user_categories).order_by('-created')]
    # top5_threads = Thread.objects.all().order_by('-views')[:5].values('id', 'title')
  • OpenCiviWiki/api/read.py

    Lines 162 to 165 in dbacc71

    # data = {
    # 'threads': feed_threads,
    # # 'trending_threads': top5_threads
    # }
  • OpenCiviWiki/api/read.py

    Lines 177 to 179 in dbacc71

    # problems = civis.filter(c_type='problem')
    # causes = civis.filter(c_type='cause')
    # solutions = civis.filter(c_type='solution')
  • OpenCiviWiki/api/read.py

    Lines 188 to 212 in dbacc71

    # for idx, item in enumerate(problems):
    # problems[idx] = json.dumps(item, cls=DjangoJSONEncoder)
    #
    # c = civis.filter(c_type='cause').order_by('-created')
    # c_scores = [ci.score(req_a.id) for ci in c]
    # causes = [Civi.objects.serialize_s(ci) for ci in c]
    # for idx, item in enumerate(causes):
    # causes[idx]['score'] = c_scores[idx]
    # causes = sorted(causes, key=lambda x: x['score'], reverse=True)
    # for idx, item in enumerate(causes):
    # causes[idx] = json.dumps(item, cls=DjangoJSONEncoder)
    #
    # c = civis.filter(c_type='solution').order_by('-created')
    # c_scores = [ci.score(req_a.id) for ci in c]
    # solutions = [Civi.objects.serialize_s(ci) for ci in c]
    # for idx, item in enumerate(solutions):
    # solutions[idx]['score'] = c_scores[idx]
    # solutions = sorted(solutions, key=lambda x: x['score'], reverse=True)
    # for idx, item in enumerate(solutions):
    # solutions[idx] = json.dumps(item, cls=DjangoJSONEncoder)
    # problems = [Civi.objects.serialize(c) for c in civis.filter(c_type='problem').order_by('-votes_vpos', '-votes_pos')]
    # problems =
    # causes = [Civi.objects.serialize(c) for c in civis.filter(c_type='cause').order_by('-votes_vpos', '-votes_pos')]
    # solutions = [Civi.objects.serialize(c) for c in civis.filter(c_type='solution').order_by('-votes_vpos', '-votes_pos')]
  • OpenCiviWiki/api/read.py

    Lines 226 to 228 in dbacc71

    # 'problems': problems,
    # 'causes': causes,
    # 'solutions': solutions,

/api/urls.py

  • # url(r'^getcivi$', read.getCivi, name='civi'),
    # url(r'^topten$', read.topTen, name='example'),
    # url(r'^topics$', read.getTopics, name='get topics'),
    # url(r'^categories$', read.getCategories, name='get categories'),
    # url(r'^useridbyusername$', read.getIdByUsername, name='get id by username'),
  • OpenCiviWiki/api/urls.py

    Lines 27 to 29 in dbacc71

    # url(r'^getblock$', read.getBlock, name='get block'),
    # url(r'^creategroup$', write.createGroup, name='add group'),
    # url(r'^createcivi$', write.createCivi, name='add civi'),
  • OpenCiviWiki/api/urls.py

    Lines 41 to 47 in dbacc71

    # url(r'^requestfriend$',write.requestFriend, name='request friend'),
    # url(r'^acceptfriend$',write.acceptFriend, name='accept friend'),
    # url(r'^removefriend$',write.removeFriend, name='remove friend'),
    # url(r'^followgroup$',write.followGroup, name='follow group'),
    # url(r'^unfollowgroup$', write.unfollowGroup, name='unfollow group'),
    # url(r'^pincivi$', write.pinCivi, name='pin civi'),
    # url(r'^unpincivi$', write.unpinCivi, name='unpin civi'),

/api/write.py

  • # from django.db.models import Q
  • OpenCiviWiki/api/write.py

    Lines 46 to 102 in dbacc71

    # @login_required
    # @transaction.atomic
    # def update_profile(request):
    # if request.method == 'POST':
    # user_form = UserForm(request.POST, instance=request.user)
    # profile_form = ProfileForm(request.POST, instance=request.user.profile)
    # if user_form.is_valid() and profile_form.is_valid():
    # user_form.save()
    # profile_form.save()
    # messages.success(request, _('Your profile was successfully updated!'))
    # return redirect('settings:profile')
    # else:
    # messages.error(request, _('Please correct the error below.'))
    # else:
    # user_form = UserForm(instance=request.user)
    # profile_form = ProfileForm(instance=request.user.profile)
    # return render(request, 'profiles/profile.html', {
    # 'user_form': user_form,
    # 'profile_form': profile_form
    # })
    # @login_required
    # @require_post_params(params=['title', 'description'])
    # def createGroup(request):
    # '''
    # USAGE:
    # create a civi Group responsible for creating and managing civi content.
    # Please validate file uploads as valid images on the frontend.
    #
    # File Uploads:
    # profile (optional)
    # cover (optional)
    #
    # Text POST:
    # title
    # description
    #
    # :returns: (200, ok, group_id) (500, error)
    # '''
    # pi = request.FILES.get('profile', False)
    # ci = request.FILES.get('cover', False)
    # title = request.POST.get(title, '')
    # data = {
    # "owner": Account.objects.get(user=request.user),
    # "title": title,
    # "description": request.POST.get('description',''),
    # "profile_image": writeImage('profile', pi, title),
    # "cover_image": writeImage('cover', ci, title)
    # }
    #
    # try:
    # group = Group(**data)
    # group.save()
    # account.groups.add(group)
    # return JsonResponse({'result':group.id})
    # except Exception as e:
    # return HttpResponseServerError(reason=e)
    #
  • OpenCiviWiki/api/write.py

    Lines 126 to 135 in dbacc71

    # hashtags = request.POST.get('hashtags', '')
    # split = [x.strip() for x in hashtags.split(',')]
    # for str in split:
    # if not Hashtag.objects.filter(title=str).exists():
    # hash = Hashtag(title=str)
    # hash.save()
    # else:
    # hash = Hashtag.objects.get(title=str)
    #
    # civi.hashtags.add(hash.id)
  • OpenCiviWiki/api/write.py

    Lines 145 to 146 in dbacc71

    # parent_civi = Civi.objects.get(id=related_civi)
    # parent_civi.links.add(civi)
  • OpenCiviWiki/api/write.py

    Lines 168 to 170 in dbacc71

    # channels_Group("thread-%s" % thread_id).send({
    # "text": json.dumps(data),
    # })
  • OpenCiviWiki/api/write.py

    Lines 555 to 581 in dbacc71

    # @login_required
    # @require_post_params(params=['friend'])
    # def requestFollow(request):
    # '''
    # USAGE:
    # Takes in a user_id and sends your id to the users friend_requests list. No join
    # is made on accounts until user accepts friend request on other end.
    #
    # Text POST:
    # friend
    #
    # :return: (200, okay) (400, error) (500, error)
    # '''
    # try:
    # account = Account.objects.get(user=request.user)
    # friend = Account.objects.get(id=request.POST.get('friend', -1))
    # if account.id in friend.friend_requests:
    # raise Exception("Request has already been sent to user")
    #
    # friend.friend_requests += [int(account.id)]
    # friend.save()
    # return HttpResponse()
    # except Account.DoesNotExist as e:
    # return HttpResponseBadRequest(reason=str(e))
    # except Exception as e:
    # return HttpResponseServerError(reason=str(e))
    #
  • OpenCiviWiki/api/write.py

    Lines 735 to 737 in dbacc71

    # new_invitation.host_user = user
    # new_invitation.invitee_email = email
    # new_invitation.verification_code = ""

/frontend_views/views.py

  • # c_scored = Civi.objects.thread_sorted_by_score(c_qs, req_acct.id)
  • # civis = Civi.objects.filter(thread_id=thread_id)
    # c = civis.order_by('-created')
    # c_scores = [ci.score(req_a.id) for ci in c]
    # c_data = [Civi.objects.serialize_s(ci) for ci in c]
    # for idx, item in enumerate(c_data):
    # c_data[idx]['score'] = c_scores[idx]
    # c_data = sorted(c_data, key=lambda x: x['score'], reverse=True)

Use explicit relative imports within CiviWiki modules

We should use explicit relative imports within a module. This promotes portability and readability.

Goal

Change CiviWiki modules to use relative imports where possible.

Task

The following files/lines can be changed to use relative imports.

/api/models/account.py

/api/models/activity.py

/api/models/civi.py

/api/models/notification.py

/api/models/rationale.py

/api/models/rebuttal.py

/api/models/response.py

/api/models/thread.py

/api/models/vote.py

/api/write.py

/api/consumers.py

CONTRIBUTING.md has small typo

In the Enable beta access for new user section, it is supposed to read "Once you have submitted the new user registration form, but for the word form". It has it as fom

Create a CiviWiki Open Canvas

Part of open project leadership is to have a clear idea of what we want to build, and to be able to quickly communicate that vision to stakeholders. The Open Canvas provides one such tool to quickly summarize a project. It lays out the parameters for building a Minimum Viable Project.

Goal

Be able to communicate the high-level goals of CiviWiki to potential community members and stakeholders.

Task

  • Complete the Open Leadership Academy Open Canvas module
  • Apply the lessons from Open Leadership Academy to create an Open Canvas for the CiviWiki project
  • Involve other project stakeholders in the design, at the least asking for feedback
  • Publish the OpenCiviWiki MVP Canvas in the project repository (/docs/organization/)

Resources

Auto-lint CiviWiki JavaScript

As part of our commitment to clean and maintainable code, we can lint our JavaScript. Linting will catch low-level details and encourage common coding conventions between CiviWiki developers.

Goal

Enable automated linting on the CiviWiki project.

Task

  • Add ESLint metadata files to project root
  • Inherit from existing ESLint style, such as Airbnb ESLint rules
  • Override any of the Airbnb ESLint rules that we disagree with
  • Run a project-wide lint, to see the extent of the problem
  • Encourage CiviWiki developers to enable auto-linting in their IDE
  • Enable auto-linting for CiviWiki GitHub pull requests

User Account Page is not saving the location

When I type in my address (not use the "Locate Me" feature), it loads the representatives. But when I leave the page (go back to my feed), and come back to the user account page, my address is gone and the list of representatives is gone.

After I tried to use the "Locate Me" feature, it again loads the representatives, but after I leave and come back the location info is missing along with the representatives.

Ran into an issue setting up a dev environment using the CONTRIBUTING.md

As I was following the directions to set up a dev environment, I ran into an issue when trying to run pip install -r requirements.txt.

This is the error I copied from the shell...

Collecting psycopg2==2.6.1 (from -r requirements.txt (line 8))
Using cached psycopg2-2.6.1.tar.gz
Complete output from command python setup.py egg_info:
running egg_info
creating pip-egg-info/psycopg2.egg-info
writing pip-egg-info/psycopg2.egg-info/PKG-INFO
writing top-level names to pip-egg-info/psycopg2.egg-info/top_level.txt
writing dependency_links to pip-egg-info/psycopg2.egg-info/dependency_links.txt
writing manifest file 'pip-egg-info/psycopg2.egg-info/SOURCES.txt'
Error: You need to install postgresql-server-dev-X.Y for building a server-side extension or libpq-dev for building a client-side application.

After doing some searching, I found some instructions. Running the following commands

$ sudo apt-get install python-psycopg2
$ sudo apt-get install libpq-dev

Then I reran the pip install -r requirements, it ran successfully.

Design CiviWiki 'bill integration' API endpoints

In order to retrieve data from Pro Publica and Open States APIs and send it to clients, we will need a 'wrapper' API. This way, we don't expose our CiviWiki API keys for the upstream services to CiviWiki users.

Goal

Produce a design for the CiviWiki API endpoints, using a standard format. Get feedback on the API design.

Task

  • Design CiviWiki 'bill integration' API endpoints using OpenAPI Specification
  • Get feedback about the proposed design from project stakeholders
  • Make adjustments to the design based on stakeholder feedback

Document project coding conventions

Code in a collaborative project should be consistent, and hopefully self-documenting. Consistency and clarity help new contributers, code reviewers, and existing developers understand the code.

Choose code standards and describe them in the contributing guide.

Resources

Remove unused imports

After running Flake8 (#33), we found that there are many unused imports in the CiviWiki codebase.

Task

Remove all unused imports from CiviWiki code:

  • ./legislation/sunlightapi.py:1:1: F401 'os' imported but unused
  • ./legislation/sunlightapi.py:2:1: F401 'json' imported but unused
  • ./legislation/admin.py:1:1: F401 'django.contrib.admin' imported but unused
  • ./legislation/tests.py:1:1: F401 'django.test.TestCase' imported but unused
  • ./legislation/views.py:1:1: F401 'django.shortcuts.render' imported but unused
  • ./utils/custom_decorators.py:4:1: F401 'django.contrib.auth.views.redirect_to_login' imported but unused
  • ./utils/custom_decorators.py:5:1: F401 'django.shortcuts.resolve_url' imported but unused
  • ./api/consumers.py:1:1: F401 'channels.Channel' imported but unused
  • ./api/consumers.py:4:1: F401 'api.models.Account' imported but unused
  • ./api/admin.py:1:1: F401 'django.contrib.admin' imported but unused
  • ./api/tasks.py:13:1: F401 'django.core.mail' imported but unused
  • ./api/tasks.py:15:1: F401 'django.core.mail.send_mass_mail' imported but unused
  • ./api/tests.py:1:1: F401 'django.test.TestCase' imported but unused
  • ./api/read.py:4:1: F401 'django.db.models.Q' imported but unused
  • ./api/read.py:6:1: F401 'django.core.serializers.json.DjangoJSONEncoder' imported but unused
  • ./api/read.py:9:1: F401 'json' imported but unused
  • ./api/read.py:13:1: F401 'tasks' imported but unused
  • ./api/write.py:1:1: F401 'random' imported but unused
  • ./api/write.py:1:1: F401 'pprint' imported but unused
  • ./api/write.py:1:1: F401 'urllib2' imported but unused
  • ./api/write.py:1:1: F401 'sys' imported but unused
  • ./api/write.py:1:1: F401 'hashlib' imported but unused
  • ./api/write.py:1:1: F401 'os' imported but unused
  • ./api/write.py:1:1: F401 'pdb' imported but unused
  • ./api/write.py:2:1: F401 'models.Hashtag' imported but unused
  • ./api/write.py:7:1: F401 'django.shortcuts.render' imported but unused
  • ./api/write.py:8:1: F401 'django.conf.settings' imported but unused
  • ./api/write.py:13:1: F401 'django.core.files.base.ContentFile' imported but unused
  • ./api/write.py:15:1: F401 'channels.Group as channels_Group' imported but unused
  • ./api/write.py:23:1: F401 'api.tasks.send_email' imported but unused
  • ./api/models/representative.py:2:1: F401 'django.conf.settings' imported but unused
  • ./api/models/invitation.py:6:1: F401 'datetime.datetime' imported but unused
  • ./api/models/invitation.py:7:1: F401 'django.utils.formats' imported but unused
  • ./api/models/civi.py:6:1: F401 'random as r' imported but unused
  • ./api/models/init.py:1:1: F401 'account.Account' imported but unused
  • ./api/models/init.py:2:1: F401 'bill.Bill' imported but unused
  • ./api/models/init.py:3:1: F401 'category.Category' imported but unused
  • ./api/models/init.py:4:1: F401 'civi.Civi' imported but unused
  • ./api/models/init.py:4:1: F401 'civi.CiviImage' imported but unused
  • ./api/models/init.py:5:1: F401 'fact.Fact' imported but unused
  • ./api/models/init.py:6:1: F401 'hashtag.Hashtag' imported but unused
  • ./api/models/init.py:7:1: F401 'notification.Notification' imported but unused
  • ./api/models/init.py:8:1: F401 'rationale.Rationale' imported but unused
  • ./api/models/init.py:9:1: F401 'rebuttal.Rebuttal' imported but unused
  • ./api/models/init.py:10:1: F401 'representative.Representative' imported but unused
  • ./api/models/init.py:11:1: F401 'response.Response' imported but unused
  • ./api/models/init.py:12:1: F401 'thread.Thread' imported but unused
  • ./api/models/init.py:13:1: F401 'vote.Vote' imported but unused
  • ./api/models/init.py:14:1: F401 'activity.Activity' imported but unused
  • ./api/models/init.py:15:1: F401 'invitation.Invitation' imported but unused
  • ./api/models/account.py:12:1: F401 'django.core.exceptions.ValidationError' imported but unused
  • ./api/models/thread.py:7:1: F401 'json' imported but unused
  • ./api/v1/views.py:4:1: F401 'requests' imported but unused
  • ./api/migrations/0024_remove_civi_links.py:4:1: F401 'django.db.models' imported but unused
  • ./api/migrations/0010_auto_20170110_1830.py:4:1: F401 'django.db.models' imported but unused
  • ./api/migrations/0016_remove_civiimage_last_modified.py:4:1: F401 'django.db.models' imported but unused
  • ./authentication/forms.py:6:1: F401 'django.utils.translation.ugettext' imported but unused
  • ./authentication/forms.py:7:1: F401 'api.models.Account' imported but unused
  • ./authentication/forms.py:11:1: F401 'django.utils.encoding.force_text' imported but unused
  • ./authentication/forms.py:12:1: F401 'django.utils.http.urlsafe_base64_decode' imported but unused
  • ./authentication/urls.py:2:1: F401 'django.contrib.auth.views.password_reset_complete' imported but unused
  • ./authentication/urls.py:2:1: F401 'django.contrib.auth.views.password_reset_done' imported but unused
  • ./authentication/authentication.py:2:1: F401 'django.db.IntegrityError' imported but unused
  • ./authentication/authentication.py:3:1: F401 'django.core.validators.validate_email' imported but unused
  • ./authentication/authentication.py:4:1: F401 'django.core.exceptions.ValidationError' imported but unused
  • ./authentication/authentication.py:7:1: F401 'django.shortcuts.redirect' imported but unused
  • ./authentication/authentication.py:10:1: F401 'reserved_usernames.RESERVED_USERNAMES' imported but unused
  • ./authentication/authentication.py:14:1: F401 'django.conf.settings' imported but unused
  • ./authentication/authentication.py:15:1: F401 'django.conf.urls.url' imported but unused
  • ./authentication/authentication.py:19:1: F401 'django.utils.http.base36_to_int' imported but unused

Move CiviWiki Django code into repository sub-directory

Following best-practices (recommended for example by Two Scoops of Django), we should move our Django project source code into a sub directory of this repository. Then, we can include other directories and files at the root level, such as documentation.

Goal

Reorganize CiviWiki repository to follow conventions established by Django community. Make room for other types of information to be stored in this repository, such as designs and documentation. E.g.

  • <repository_root>
    • project/
      • Django project files go here
    • docs/
      • documentation and design files go here
    • etc.

Task

  • Create a sub-folder in this repository, e.g. called project
  • Move all Django files/folders into the sub-directory

User-signup flow somewhat confusing

The sign-up process for new users is somewhat confusing.

Observed behavior

The user is presented with an apology message immediately after filling out the sign-up form, which seems to indicate that the platform is in closed beta. However, an account activation email is still sent to the user, allowing them to complete the registration process.

Expected behavior

Upon filling out the registration form, the user might see a welcome page. The welcome page can inform them to check their inbox for an activation email. The confirmation screen might also mention that the site is in open beta.

Alternatively, the site might disable registration until open beta.

Steps to reproduce

  1. visit https://www.civiwiki.org
  2. click any of the sign in/sign up buttons
  3. fill in and submit the form

Sign up flow

peek 2017-06-14 18-51

Apology screen (beta period)

screenshot_20170614_190251

Confirmation/activation email received

screenshot_20170614_185522

Review Flake8 configuration, remove rules from ignore that would improve our code quality

While auditing the project code quality (#33), I noticed that several Flake8 rules were being ignored:

[flake8]
ignore = E128,E265,E261,E126,E501,E302,E262,E127,E303,E226,E231,E201,E202,E121,E203,E123,W293,W391,E122,W292,F403,E401,E131,W503,E731,E266

While it may be desirable to ignore some Flake8 rules, there are likely rules being ignored that would encourage good coding practices. For example, we are lacking a lot of docstrings in CiviWiki modules and classes.

Rules we currently ignore

Continuation lines

Comments

  • E265, block comment should start with ‘# ‘
  • E261, at least two spaces before inline comment
  • E262, inline comment should start with ‘# ‘
  • E266, too many leading ‘#’ for block comment

Whitespace

  • E501, line too long (82 > 79 characters)
  • E302, expected 2 blank lines, found 0
  • E303, too many blank lines (3)
  • E226, missing whitespace around arithmetic operator
  • E231, missing whitespace after ‘,’, ‘;’, or ‘:’
  • E201, whitespace after ‘(‘
  • E202, whitespace before ‘)’
  • E203, whitespace before ‘:’
  • W293, blank line contains whitespace
  • W391, blank line at end of file
  • W292, no newline at end of file
  • W503, line break occurred before a binary operator

Other

  • E123, closing bracket does not match indentation of opening bracket’s line
  • F403, ‘from module import *’ used; unable to detect undefined names
  • E401, multiple imports on one line
  • E731, do not assign a lambda expression, use a def

Goal

Refine the Flake8 configuration. Ignore fewer Flake8 rules. Improve our code quality/practices.

Tasl

  • Add description of each ignored Flakd8 rule to this isse
  • Determine which Flake8 rules to continue ignoring
  • Remove useful Flake8 rules from the ignore list, to improve our project code quality

Reorganize imports to follow best practices

Upgrade project dependencies

Note: the goal of this task is simply to update as many dependencies as possible. Difficult dependencies can be updated in follow-up tasks.

As part of our commitment to ongoing maintenance and security, we can periodically upgrade project dependencies.

Situation

As of today (2017-08-30), pip shows the following dependencies are outdated:

Package                 Version Latest  Type                                                                                                                                                                                                                                   
----------------------- ------- ------- -----                                                                                                                                                                                                                                  
asgi-redis              1.0.0   1.4.2   wheel                                                                                                                                                                                                                                  
asgiref                 1.0.1   1.1.2   wheel                                                                                                                                                                                                                                  
autobahn                17.6.2  17.8.1  wheel                                                                                                                                                                                                                                  
billiard                3.5.0.2 3.5.0.3 sdist                                                                                                                                                                                                                                  
boto                    2.46.1  2.48.0  wheel                                                                                                                                                                                                                                  
celery                  4.0.2   4.1.0   wheel                                                                                                                                                                                                                                  
channels                1.0.3   1.1.6   wheel                                                                                                                                                                                                                                  
cryptography            1.9     2.0.3   wheel                                                                                                                                                                                                                                  
daphne                  1.1.0   1.3.0   wheel                                                                                                                                                                                                                                  
dj-database-url         0.4.1   0.4.2   wheel                                                                                                                                                                                                                                  
Django                  1.8.7   1.11.4  wheel                                                                                                                                                                                                                                  
django-cors-headers     1.1.0   2.1.0   wheel                                                                                                                                                                                                                                  
django-notifications-hq 1.2     1.3     wheel                                                                                                                                                                                                                                  
django-storages         1.5.2   1.6.5   wheel                                                                                                                                                                                                                                  
djangorestframework     3.6.3   3.6.4   wheel                                                                                                                                                                                                                                  
docutils                0.12    0.14    wheel                                                                                                                                                                                                                                  
gunicorn                19.6.0  19.7.1  wheel                                                                                                                                                                                                                                  
h2                      2.6.1   3.0.1   wheel                                                                                                                                                                                                                                  
hpack                   2.3.0   3.0.0   wheel
idna                    2.5     2.6     wheel
jmespath                0.9.0   0.9.3   wheel
kombu                   4.0.2   4.1.0   wheel
Pillow                  3.4.2   4.2.1   wheel
psycopg2                2.6.1   2.7.3.1 wheel
pyasn1                  0.2.3   0.3.3   wheel
pyasn1-modules          0.0.9   0.1.1   wheel
pyflakes                1.5.0   1.6.0   wheel
pyOpenSSL               16.2.0  17.2.0  wheel
python-dateutil         2.4.2   2.6.1   wheel
redis                   2.10.5  2.10.6  wheel
requests                2.8.1   2.18.4  wheel
service-identity        16.0.0  17.0.0  wheel
setuptools              27.2.0  36.3.0  wheel
Twisted                 17.1.0  17.5.0  sdist
txaio                   2.8.0   2.8.1   wheel
vine                    1.1.3   1.1.4   wheel
whitenoise              3.2     3.3.0   wheel

Piprot gives a slightly different summary:

Django (1.8.7) is 615 days out of date. Latest is 1.11.4
django-cors-headers (1.1.0) is 741 days out of date. Latest is 2.1.0
djangorestframework (3.6.3) is 101 days out of date. Latest is 3.6.4
docutils (0.12) is 818 days out of date. Latest is 0.14
gunicorn (19.6.0) is 301 days out of date. Latest is 19.7.1
jmespath (0.9.0) is 603 days out of date. Latest is 0.9.3
psycopg2 (2.6.1) is 658 days out of date. Latest is 2.7.3.1
python-dateutil (2.4.2) is 831 days out of date. Latest is 2.6.1
requests (2.8.1) is 672 days out of date. Latest is 2.18.4
whitenoise (3.2) is 244 days out of date. Latest is 3.3.0
dj-database-url (0.4.1) is 273 days out of date. Latest is 0.4.2
Pillow (3.4.2) is 260 days out of date. Latest is 4.2.1
daphne (1.1.0) is 89 days out of date. Latest is 1.3.0
asgiref (1.0.1) is 58 days out of date. Latest is 1.1.2
channels (1.0.3) is 146 days out of date. Latest is 1.1.6
asgi-redis (1.0.0) is 227 days out of date. Latest is 1.4.2
django-notifications-hq (1.2) is 374 days out of date. Latest is 1.3
boto (2.46.1) is 135 days out of date. Latest is 2.48.0
django-storages (1.5.2) is 199 days out of date. Latest is 1.6.5
Twisted (17.1.0) is 119 days out of date. Latest is 17.5.0
h2 (2.6.1) is 17 days out of date. Latest is 3.0.1
pyOpenSSL (16.2.0) is 277 days out of date. Latest is 17.2.0
service-identity (16.0.0) is 460 days out of date. Latest is 17.0.0
idna (2.5) is 154 days out of date. Latest is 2.6
celery (4.0.2) is 220 days out of date. Latest is 4.1.0

Goal

Keep project dependencies up-to-date.

Task

Update most, or all, of the following dependencies:

  • asgi-redis (1.0.0) - Latest: 1.4.2 [wheel]
  • asgiref (1.0.1) - Latest: 1.1.2 [wheel]
  • autobahn (17.6.2) - Latest: 17.8.1 [wheel]
  • billiard (3.5.0.2) - Latest: 3.5.0.3 [sdist]
  • boto (2.46.1) - Latest: 2.48.0 [wheel]
  • celery (4.0.2) - Latest: 4.1.0 [wheel]
  • channels (1.0.3) - Latest: 1.1.6 [wheel]
  • cryptography (1.9) - Latest: 2.0.3 [wheel]
  • daphne (1.1.0) - Latest: 1.3.0 [wheel]
  • dj-database-url (0.4.1) - Latest: 0.4.2 [wheel]
  • django-cors-headers (1.1.0) - Latest: 2.1.0 [wheel]
  • django-notifications-hq (1.2) - Latest: 1.3 [wheel]
  • django-storages (1.5.2) - Latest: 1.6.5 [wheel]
  • djangorestframework (3.6.3) - Latest: 3.6.4 [wheel]
  • docutils (0.12) - Latest: 0.14 [wheel]
  • gunicorn (19.6.0) - Latest: 19.7.1 [wheel]
  • h2 (2.6.1) - Latest: 3.0.1 [wheel]
  • hpack (2.3.0) - Latest: 3.0.0 [wheel]
  • idna (2.5) - Latest: 2.6 [wheel]
  • jmespath (0.9.0) - Latest: 0.9.3 [wheel]
  • kombu (4.0.2) - Latest: 4.1.0 [wheel]
  • Pillow (3.4.2) - Latest: 4.2.1 [wheel]
  • psycopg2 (2.6.1) - Latest: 2.7.3.1 [wheel]
  • pyasn1 (0.2.3) - Latest: 0.3.3 [wheel]
  • pyasn1-modules (0.0.9) - Latest: 0.1.1 [wheel]
  • pyflakes (1.5.0) - Latest: 1.6.0 [wheel]
  • pyOpenSSL (16.2.0) - Latest: 17.2.0 [wheel]
  • python-dateutil (2.4.2) - Latest: 2.6.1 [wheel]
  • redis (2.10.5) - Latest: 2.10.6 [wheel]
  • requests (2.8.1) - Latest: 2.18.4 [wheel]
  • service-identity (16.0.0) - Latest: 17.0.0 [wheel]
  • setuptools (27.2.0) - Latest: 36.3.0 [wheel]
  • Twisted (17.1.0) - Latest: 17.5.0 [sdist]
  • txaio (2.8.0) - Latest: 2.8.1 [wheel]
  • vine (1.1.3) - Latest: 1.1.4 [wheel]
  • whitenoise (3.2) - Latest: 3.3.0 [wheel]

When a dependency is difficult or impossible to update, add a comment below describing the problem.

Move all imports to top of file

As part of our clean-code conventions, all imports should be at the top of their file.

Goal

Move all imports to top of their file. No import errors when running Flake8 (#33).

Task

The following imports should be moved to the top of their file:

  • ./civiwiki/wsgi.py:14:1: E402 module level import not at top of file
  • ./civiwiki/wsgi.py:15:1: E402 module level import not at top of file

Automatically audit/monitor source code quality metrics

In order to promote maintainability and readability, we can use common measures of 'code complexity' as heuristics when developing/refactoring code.

CodeClimate will automatically scan CiviWiki sourcecode, and return a score based on common 'maintainability' metrics. These metrics include file/function length, number of function parameters, duplicate code, etc. CodeClimate is free for open source projects, and is used, for example, by the Django project.

Goal

Have CiviWiki code automatically audited for maintainability and quality.

Task

  • Configure CodeClimate to scan the OpenCiviWiki repository
  • Add CodeClimate badge to top of OpenCiviWiki README

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.