Finish up user and social media conversions.

This commit is contained in:
Will O'Beirne 2018-11-19 15:23:56 -05:00
parent d7e4c1c533
commit c51b1e2dab
No known key found for this signature in database
GPG Key ID: 44C190DB5DEAF9F6
15 changed files with 40 additions and 27 deletions

View File

@ -124,17 +124,22 @@ class SocialMediaSchema(ma.Schema):
model = SocialMedia
# Fields to expose
fields = (
"url",
"service",
"username",
)
url = ma.Method("get_url")
service = ma.Method("get_service")
username = ma.Method("get_username")
def get_url(self, obj):
return obj.social_media_link
def get_service(self, obj):
info = get_social_info_from_url(obj.social_media_link)
return info['service']
def get_username(self, obj):
info = get_social_info_from_url(obj.social_media_link)
return info['username']

View File

@ -39,13 +39,9 @@ def get_me():
@blueprint.route("/<user_identity>", methods=["GET"])
@endpoint.api()
def get_user(user_identity):
print('get by ident')
user = User.get_by_identifier(email_address=user_identity, account_address=user_identity)
print(user)
if user:
print('dumping')
result = user_schema.dump(user)
print(result)
return result
else:
message = "User with account_address or user_identity matching {} not found".format(user_identity)

View File

@ -15,5 +15,5 @@ def get_social_info_from_url(url: str):
if match:
return {
'service': service,
'username': match.group(1),
'username': match.group(1)
}

View File

@ -44,7 +44,9 @@ class TestAPI(BaseUserConfig):
users_json = users_get_resp.json
self.assertEqual(users_json["avatar"]["imageUrl"], self.user.avatar.image_url)
self.assertEqual(users_json["socialMedias"][0]["socialMediaLink"], self.user.social_medias[0].social_media_link)
self.assertEqual(users_json["socialMedias"][0]["service"], 'GITHUB')
self.assertEqual(users_json["socialMedias"][0]["username"], 'groot')
self.assertEqual(users_json["socialMedias"][0]["link"], self.user.social_medias[0].social_media_link)
self.assertEqual(users_json["displayName"], self.user.display_name)
def test_get_single_user_by_account_address(self):
@ -54,7 +56,9 @@ class TestAPI(BaseUserConfig):
users_json = users_get_resp.json
self.assertEqual(users_json["avatar"]["imageUrl"], self.user.avatar.image_url)
self.assertEqual(users_json["socialMedias"][0]["socialMediaLink"], self.user.social_medias[0].social_media_link)
self.assertEqual(users_json["socialMedias"][0]["service"], 'GITHUB')
self.assertEqual(users_json["socialMedias"][0]["username"], 'groot')
self.assertEqual(users_json["socialMedias"][0]["link"], self.user.social_medias[0].social_media_link)
self.assertEqual(users_json["displayName"], self.user.display_name)
def test_create_user_duplicate_400(self):

View File

@ -1565,8 +1565,14 @@
"links": {},
"address": "0x23de420265da56889af074254dd900bc888efbf6",
"transactionHash": "0xa0259d1a6924f52fb52017ad410a860083749e4d444a29f02ed70309b831a123"
},
"1542657525387": {
"events": {},
"links": {},
"address": "0x355f1ceac11b3b41641657c24258f74cdd7a1f4b",
"transactionHash": "0xa0259d1a6924f52fb52017ad410a860083749e4d444a29f02ed70309b831a123"
}
},
"schemaVersion": "2.0.1",
"updatedAt": "2018-11-16T20:37:00.160Z"
"updatedAt": "2018-11-19T19:59:35.976Z"
}

View File

@ -28,13 +28,13 @@ describe("create proposal", () => {
{
name: "Alisha Endtoend",
title: "QA Robot0",
ethAddress: `0x0000${randomEthHex}0000`,
accountAddress: `0x0000${randomEthHex}0000`,
emailAddress: `qa.alisha.${id}@grant.io`
},
{
name: "Billy Endtoend",
title: "QA Robot1",
ethAddress: `0x1111${randomEthHex}1111`,
accountAddress: `0x1111${randomEthHex}1111`,
emailAddress: `qa.billy.${id}@grant.io`
}
],
@ -79,7 +79,7 @@ describe("create proposal", () => {
cy.get('.TeamMember-info input[name="name"]').type(proposal.team[0].name);
cy.get('.TeamMember-info input[name="title"]').type(proposal.team[0].title);
cy.get("@EthAccounts").then(accts => {
cy.get('.TeamMember-info input[name="ethAddress"]').type(
cy.get('.TeamMember-info input[name="accountAddress"]').type(
accts[0].toString()
);
});
@ -94,7 +94,7 @@ describe("create proposal", () => {
cy.get('.TeamMember-info input[name="name"]').type(proposal.team[1].name);
cy.get('.TeamMember-info input[name="title"]').type(proposal.team[1].title);
cy.get("@EthAccounts").then(accts => {
cy.get('.TeamMember-info input[name="ethAddress"]').type(
cy.get('.TeamMember-info input[name="accountAddress"]').type(
accts[1].toString()
);
});

View File

@ -1,7 +1,7 @@
import React from 'react';
import lodash from 'lodash';
import { Input, Form, Col, Row, Button, Icon, Alert } from 'antd';
import { SOCIAL_INFO } from 'utils/social';
import { SOCIAL_INFO, socialMediaToUrl } from 'utils/social';
import { SOCIAL_SERVICE, User } from 'types';
import { UserState } from 'modules/users/reducers';
import { getCreateTeamMemberError } from 'modules/create/utils';
@ -224,6 +224,7 @@ export default class ProfileEdit extends React.PureComponent<Props, State> {
socialMedias.push({
service,
username: value,
url: socialMediaToUrl(service, value),
});
}
@ -245,7 +246,7 @@ export default class ProfileEdit extends React.PureComponent<Props, State> {
const fields = {
...this.state.fields,
avatar: {
image_url: `https://randomuser.me/api/portraits/${gender}/${num}.jpg`,
imageUrl: `https://randomuser.me/api/portraits/${gender}/${num}.jpg`,
},
};
const isChanged = this.isChangedCheck(fields);

View File

@ -6,7 +6,7 @@ import { usersActions } from 'modules/users';
import { UserState } from 'modules/users/reducers';
import ProfileEdit from './ProfileEdit';
import UserAvatar from 'components/UserAvatar';
import { SOCIAL_INFO, socialMediaToUrl } from 'utils/social';
import { SOCIAL_INFO } from 'utils/social';
import ShortAddress from 'components/ShortAddress';
import './ProfileUser.less';
import { AppState } from 'store/reducers';
@ -97,7 +97,7 @@ class ProfileUser extends React.Component<Props> {
const Social = ({ socialMedia }: { socialMedia: SocialMedia }) => {
return (
<a href={socialMediaToUrl(socialMedia)} target="_blank" rel="noopener nofollow">
<a href={socialMedia.url} target="_blank" rel="noopener nofollow">
<div className="ProfileUser-info-social-icon">
{SOCIAL_INFO[socialMedia.service].icon}
</div>

View File

@ -80,7 +80,7 @@ class Profile extends React.Component<Props> {
<HeaderDetails
title={`${user.displayName} is funding projects on Grant.io`}
description={`Join ${user.displayName} in funding the future!`}
image={user.avatar ? user.avatar.image_url : undefined}
image={user.avatar ? user.avatar.imageUrl : undefined}
/>
<ProfileUser user={user} />
<Tabs>

View File

@ -9,8 +9,8 @@ interface Props {
}
const UserAvatar: React.SFC<Props> = ({ user, className }) => {
if (user.avatar && user.avatar.image_url) {
return <img className={className} src={user.avatar.image_url} />;
if (user.avatar && user.avatar.imageUrl) {
return <img className={className} src={user.avatar.imageUrl} />;
} else if (user.accountAddress) {
return <Identicon className={className} address={user.accountAddress} />;
} else {

View File

@ -4,8 +4,8 @@ import { socialMediaToUrl } from 'utils/social';
export function formatUserForPost(user: User) {
return {
...user,
avatar: user.avatar ? user.avatar.image_url : null,
socialMedias: user.socialMedias.map(socialMediaToUrl),
avatar: user.avatar ? user.avatar.imageUrl : null,
socialMedias: user.socialMedias.map(sm => socialMediaToUrl(sm.service, sm.username)),
};
}

View File

@ -1,7 +1,7 @@
import React from 'react';
import { Icon } from 'antd';
import keybaseIcon from 'static/images/keybase.svg';
import { SOCIAL_SERVICE, SocialMedia, SocialInfo } from 'types';
import { SOCIAL_SERVICE, SocialInfo } from 'types';
const accountNameRegex = '([a-zA-Z0-9-_]*)';
export const SOCIAL_INFO: { [key in SOCIAL_SERVICE]: SocialInfo } = {
@ -31,6 +31,6 @@ export const SOCIAL_INFO: { [key in SOCIAL_SERVICE]: SocialInfo } = {
},
};
export function socialMediaToUrl(sm: SocialMedia): string {
return SOCIAL_INFO[sm.service].format.replace(accountNameRegex, sm.username);
export function socialMediaToUrl(service: SOCIAL_SERVICE, username: string): string {
return SOCIAL_INFO[service].format.replace(accountNameRegex, username);
}

View File

@ -12,7 +12,7 @@ const user: User = {
displayName: 'Dana Hayes',
title: 'QA Engineer',
avatar: {
image_url: 'https://randomuser.me/api/portraits/women/19.jpg',
imageUrl: 'https://randomuser.me/api/portraits/women/19.jpg',
},
accountAddress: DONATION.ETH,
emailAddress: 'test@test.test',

View File

@ -3,6 +3,7 @@ import React from 'react';
export type SocialAccountMap = Partial<{ [key in SOCIAL_SERVICE]: string }>;
export interface SocialMedia {
url: string;
service: SOCIAL_SERVICE;
username: string;
}

View File

@ -7,5 +7,5 @@ export interface User {
displayName: string;
title: string;
socialMedias: SocialMedia[];
avatar: { image_url: string } | null;
avatar: { imageUrl: string } | null;
}