hasgeek / hasjob Goto Github PK
View Code? Open in Web Editor NEWHasjob, the Hasgeek job board
Home Page: https://hasjob.co
License: GNU Affero General Public License v3.0
Hasjob, the Hasgeek job board
Home Page: https://hasjob.co
License: GNU Affero General Public License v3.0
Just like the existing job board, allow developers post their skills in maybe 180 characters.
PS: i'm a developer, not a recruiter ;)
Let posters choose between two options: email and URL. Wrap both types of links to count clicks. Disable free text here, let that be in description instead.
The board needs a way to browse by company (currently proxied for by the poster) OR by type of company: startups, stable companies, etc.
The latter is not straightforward. We have no way to do this unless we track companies, a la CrunchBase.
In Hasjob's new avatar as a rich client app, job cards should be cached locally so that the server only needs to send the newest cards. Reloading the page takes way too long on mobile.
When jobs are cross-posted to forums like Facebook, commentators often nitpick about grammar and spelling. The job board should have a suggested edit feature where anyone (or anyone with a certain reputation level or higher) should be able to edit the post and submit the edits for review by the original poster.
The job board could be a nicer place if people supported each other rather than pulling each other down.
Folks sometimes respond to @hasjob's tweets. This is useless because the reply isn't directed to the person listing the job. They'll not see it.
We should ask for the lister's Twitter id in the posting form and include that in the tweet so that a Reply All will include them.
Search results are sorted by relevancy which is confusing to browse. Results sorted by date would be easier to look at.
Title for the rss feed is incorrect. The title seems to be picked up from the last post - should instead of a fixed text like Hasgeek job board or something.
'Withdrawn' hides the listing entirely. Sometimes it's good to indicate the position has been filled, while leaving the description available for all to see.
Two email addresses are accepted. They shouldn't be.
Instead of letting applicants contact over email, require them to apply with a HasGeek profile. The Show Instructions button will become an I'm Interested button which will send a notice to the employer. If they are interested in the candidate, they can connect and Hasjob emails both parties to introduce them.
The profile page becomes an easy way to gauge the candidate's experience level.
Many jobs don't have a clear enough description. Allowing users to comment will help make the listings interactive.
The flip side is that less savvy users will attempt to apply for the job via comments, adding noise for others.
We should have commenting as a controlled feature to see how it works.
If not done deliberately, this is a bug.
I am guessing changing the views.py at line 499 (def search()
) can help:
results = sorted(results, key=lambda x: x.count, reverse=True) if results[0]['idref'].split('/')[0]=='post'
I'll submit a patch if the change looks okay.
for every job, the content could be passed through https://github.com/rowanmanning/joblint to get a "job spec" score & use it on the UI somehow.
Write a cron to weed this out.
@hallidude look up what micro-schema applies to hasjob.
For non-permanent jobs, the employer should be asked to reveal the duration of the assignment.
This will require tagging job types to some form fields and having those fields show selectively.
The feed url doesn't validate - http://jobs.hasgeek.com/feed.
You can see the errors here - http://validator.w3.org/feed/
flaskext.assets has been renamed as flask.ext.assets, used in assets.py
flaskext.sqlalchemy has been renamed as flask.ext.sqlalchemy, used in models.py and search.py
Sorry I am still figuring things out so could not send a patch.
Users sometimes forget to include the http://
in a link. The editor widget should validate all links in the post to confirm they are correct.
The Job page needs to have a description friendly to search engines. The description can be a combination of Job, location & company.
Currently "Tweet This" or "Email This" options are available. There should be option so that user can share job using Facebook like share on Facebook.
Stats updates shouldn't be in GET requests. Move it to a background queue.
Tinymce font(description field) and job posting page uses different fonts. Use same font.
Hasjob should support aggregation pages across companies.
An accelerator/incubator like the Morpheus should be able to make a page that lists jobs from across their portfolio companies.
Email is what we use to communicate with the original poster. It shouldn't be editable.
Add a multiple opening option for same job
URL slugs don't say enough about the listing.
It's not clear why Hasjob needs jQuery UI. It should be removed with bootstrap plugins used instead.
A front end user interface that can pull out data about HasJob is required.
The data parameters required are
The HasJob database can be used to coordinate the marketing and sponsorship activities. This is a good approach to take as users on the list already know of Hasgeek and will be open to exploring sponsorship options with us.
This feature can be further extended in the future to include a company's cumulative activity data on Hasgeek products and events, a part of the larger Hasgeek profile building activity
The Twitter posting code doesn't check for tweet length accurately. It failed on this listing: http://jobs.hasgeek.com/view/pkqjq.
Traceback:
File "/usr/local/lib/python2.6/dist-packages/Flask-0.8-py2.6.egg/flask/app.py", line 1504, in wsgi_app
response = self.full_dispatch_request()
File "/usr/local/lib/python2.6/dist-packages/Flask-0.8-py2.6.egg/flask/app.py", line 1264, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/usr/local/lib/python2.6/dist-packages/Flask-0.8-py2.6.egg/flask/app.py", line 1262, in full_dispatch_request
rv = self.dispatch_request()
File "/usr/local/lib/python2.6/dist-packages/Flask-0.8-py2.6.egg/flask/app.py", line 1248, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/var/www/hasjob/views.py", line 347, in confirm_email
_external=True), post.location)
File "/var/www/hasjob/twitter.py", line 26, in tweet
api.update_status(text)
File "/usr/local/lib/python2.6/dist-packages/tweepy/binder.py", line 179, in _call
return method.execute()
File "/usr/local/lib/python2.6/dist-packages/tweepy/binder.py", line 162, in execute
raise TweepError(error_msg, resp)
TweepError: The text of your tweet is too long.
Tweet text:
text = u'Website QA Analysts to perform functional, regression, and other types of website QA for Food.com. http://hsgk.in/IwOOTu #Bangalore'
Employers are getting confused by the Make Connection button. Its not obvious what it does.
Further, the connection email that is sent out does not indicate who is responsible for following up, the candidate or the employer.
Hasjob should instead provide a text field for the employer to send a message directly to the candidate, and should record this response.
In future this process can take place over an email gateway instead of the web.
Reported by @surdattack.
Hasjob should use location tagging instead of a freeform location text field. The Geonames webservice can be used to autocomplete location names:
http://ws.geonames.org/searchJSON?name_startsWith=<term>&countryBias=IN&featureClass=P&callback=<callback>
Companies like HackerEarth regularly list on Hasjob for their clients. They are in our approved list of recruiters who pay for every listing.
We've should make this a flag that shows on the listing. I propose:
When searching for a job, the queried phrase should appear in the search box on the results page.
Domain verification is required to protect from fake listings. If someone posts with example.com as the website address and provides an email address @example.com, then their domain is considered verified -- the listing came from someone in the organization.
Non-verified listings should be held for moderation.
Recruiters ignore the no-contact flag, so warn users against giving away contact information.
An expiry notice should be sent 1-2 days prior to the listing expiring.
The linkify in Issue #28 is causing a bunch of side effects. This call should go into rendering instead of when saving to the database.
The Apply section is a plain text field and so doesn't go through bleach.clean
and bleach.linkify
. It could contain links though, so it needs to be passed through bleach.linkify
when rendering the page. Watch for conflicts with the other parser that handles email addresses.
The How to Apply
section must include a URL or email address, to prevent accidental listings with no contact information.
Whoosh locks the index when updating it. This causes locking errors on the rare occasion when two job listings are confirmed at the same time. Here's a typical traceback:
Exception on /confirm/z39wf [POST] Traceback (most recent call last):
File "/usr/local/lib/python2.6/dist-packages/Flask-0.8-py2.6.egg/flask/app.py", line 1504, in wsgi_app
response = self.full_dispatch_request()
File "/usr/local/lib/python2.6/dist-packages/Flask-0.8-py2.6.egg/flask/app.py", line 1264, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/usr/local/lib/python2.6/dist-packages/Flask-0.8-py2.6.egg/flask/app.py", line 1262, in full_dispatch_request
rv = self.dispatch_request()
File "/usr/local/lib/python2.6/dist-packages/Flask-0.8-py2.6.egg/flask/app.py", line 1248, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/var/www/hasjob/views.py", line 312, in confirm
db.session.commit()
File "/usr/local/lib/python2.6/dist-packages/sqlalchemy/orm/scoping.py", line 114, in do
return getattr(self.registry(), name)(*args, **kwargs)
File "/usr/local/lib/python2.6/dist-packages/sqlalchemy/orm/session.py", line 655, in commit
self.transaction.commit()
File "/usr/local/lib/python2.6/dist-packages/sqlalchemy/orm/session.py", line 319, in commit
self.session.dispatch.after_commit(self.session)
File "/usr/local/lib/python2.6/dist-packages/sqlalchemy/event.py", line 291, in __call__
fn(*args, **kw)
File "/usr/local/lib/python2.6/dist-packages/flask_sqlalchemy.py", line 185, in after_commit
models_committed.send(session.app, changes=d.values())
File "/usr/local/lib/python2.6/dist-packages/blinker/base.py", line 220, in send
for receiver in self.receivers_for(sender)]
File "/var/www/hasjob/search.py", line 57, in on_models_committed
writer = ix.writer()
File "/usr/local/lib/python2.6/dist-packages/Whoosh-1.8.0-py2.6.egg/whoosh/filedb/fileindex.py", line 271, in writer
return SegmentWriter(self, **kwargs)
File "/usr/local/lib/python2.6/dist-packages/Whoosh-1.8.0-py2.6.egg/whoosh/filedb/filewriting.py", line 125, in __init__
raise LockError
LockError
Possible solution: catch the exception, sleep a second, and try again.
Ignore candidate should send a canned response back to the candidate. It should be possible to add this canned response at the time of creation.
hasjob is not using bootstrap or for that matter, even baseframe.
We need to port all templates to use Bootstrap 3.
Login will enable management of listings from the website, including tracking responses and reporting spammers.
Candidates should be able to apply by submitting their LinkedIn profile. HasJob needs an "Apply with LinkedIn" button.
User profile pages should have an anonymous version where a summary of relevant information is provided along with endorsements from real people, without revealing the individual's identity.
Suggested by @jitendravyas.
Generate a view and a feed by poster.
Make it clear you can't have dupes
The agelimit
and newlimit
variables should be in settings. However, importing timedelta
in the settings file is a no-no (no code in settings), so we do it like this:
# settings.py
AGE_LIMIT = {'days': 30}
NEW_LIMIT = {'days': 1}
# code
agelimit = timedelta(**app.config['AGE_LIMIT'])
newlimit = timedelta(**app.config['NEW_LIMIT'])
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.